Java OutputStreamWriter 마스터하기: 문자-바이트 변환과 실전 예제
Java OutputStreamWriter 클래스
Java의 OutputStreamWriter로 캐릭터와 바이트 스트림을 연결하는 방법을 실전 코드 스니펫과 함께 알아봅니다.
java.io의 OutputStreamWriter 클래스는 문자 데이터를 바이트 데이터로 변환하는 다리 역할을 합니다. 추상 Writer 클래스를 확장하며 FileOutputStream 같은 바이트 스트림과 함께 작동합니다.
일부 유니코드 문자가 여러 바이트에 걸치므로, OutputStreamWriter는 바이트 스트림에 쓸 때 문자 인코딩이 올바르게 적용되도록 보장합니다.
OutputStreamWriter 생성하기
필요한 클래스들을 임포트하는 것으로 시작합니다:
import java.io.OutputStreamWriter;
import java.io.FileOutputStream;
import java.nio.charset.Charset;
파일을 타겟팅하는 FileOutputStream을 인스턴스화한 다음 OutputStreamWriter로 래핑합니다. 기본 생성자는 플랫폼의 기본 캐릭터셋을 사용하지만, 환경 간 일관성을 위해 UTF-8이나 UTF-16을 명시적으로 설정할 수 있습니다:
// 기본 캐릭터셋
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("output.txt"));
// 명시적 UTF-8
OutputStreamWriter writerUtf8 = new OutputStreamWriter(
new FileOutputStream("output_utf8.txt"), Charset.forName("UTF-8"));
OutputStreamWriter의 핵심 메서드
OutputStreamWriter는 Writer의 모든 추상 메서드를 구현합니다. 가장 일반적으로 사용되는 메서드들은 다음과 같습니다:
write() 메서드
write(int c) - 단일 문자를 씁니다.
write(char[] cbuf) - 문자 배열을 씁니다.
write(String str) - 문자열을 씁니다.
예제: 텍스트를 파일에 쓰기
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) {
String data = "This is a line of text inside the file.";
try {
FileOutputStream fileOut = new FileOutputStream("output.txt");
OutputStreamWriter writer = new OutputStreamWriter(fileOut, Charset.forName("UTF-8"));
writer.write(data);
writer.flush();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
이 프로그램을 실행하면 output.txt가 생성되며 다음 내용이 들어있습니다:
This is a line of text inside the file.
getEncoding() 메서드
getEncoding()을 사용하여 현재 사용 중인 캐릭터셋을 조회합니다:
FileOutputStream file = new FileOutputStream("output.txt");
OutputStreamWriter defaultWriter = new OutputStreamWriter(file);
OutputStreamWriter utf8Writer = new OutputStreamWriter(file, Charset.forName("UTF-8"));
System.out.println("Default encoding: " + defaultWriter.getEncoding());
System.out.println("UTF-8 encoding: " + utf8Writer.getEncoding());
실행 결과
Default encoding: Cp1252
UTF-8 encoding: UTF-8
캐릭터셋이 지정되지 않으면 플랫폼 기본값이 반환됩니다. 캐릭터셋을 명시적으로 설정하면 일관된 동작을 보장합니다.
팁: 정밀한 제어를 위해 Charset.forName()을 사용하세요. 자세한 내용은 공식 Java Charset API를 참조하세요.
close() 메서드
시스템 리소스를 해제하기 위해 항상 close()를 호출하세요. 닫은 후에는 라이터를 다시 사용할 수 없습니다.
추가 유용한 메서드
| 메서드 | 설명 |
flush() | 버퍼링된 데이터를 즉시 기본 스트림에 씁니다. |
append() | 문자나 문자열을 라이터에 편리하게 추가합니다. |
완전한 레퍼런스는 공식 Java OutputStreamWriter Javadoc을 참조하세요.