Java의 입출력(I/O) API를 다룰 때 OutputStream과 Writer는 서로 다른 목적을 가진 클래스입니다. OutputStream은 바이트(byte) 기반 스트림인 반면, Writer는 문자(character) 기반 스트림입니다.
이 두 클래스를 연결하려면 OutputStreamWriter 클래스를 사용하면 됩니다. ByteArrayOutputStream 객체를 OutputStreamWriter 생성자의 인자로 전달하는 방식으로 변환이 가능합니다.
OutputStreamWriter란?
OutputStreamWriter는 문자 스트림과 바이트 스트림 사이를 연결해 주는 브리지(bridge) 역할을 하는 클래스입니다. 이 클래스에 작성된 문자들은 지정된 문자셋(charset)을 사용하여 바이트로 인코딩됩니다. 별도의 문자셋을 지정하지 않으면 플랫폼의 기본 문자셋이 적용됩니다.
클래스 선언 구문
public class OutputStreamWriter extends Writer
위 선언에서 확인할 수 있듯이, OutputStreamWriter는 Writer 클래스를 상속받기 때문에 Writer가 제공하는 모든 메서드를 그대로 사용할 수 있습니다.
변환 예제 코드
다음 예제는 ByteArrayOutputStream을 OutputStreamWriter로 감싸서 문자열을 작성한 후, 결과를 바이트 배열로 출력하는 과정을 보여줍니다.
import java.io.*;
public class OutputStreamToWriterTest {
public static void main(String[] args) throws Exception {
String str = "TUTORIALSPOINT";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(baos);
for (int i = 0; i < str.length(); i++) {
osw.write((int) str.charAt(i));
}
osw.close();
byte[] b = baos.toByteArray();
for (int j = 0; j < b.length; j++) {
System.out.println(b[j]);
}
}
}코드 설명
- ByteArrayOutputStream 생성: 메모리 내에서 바이트 데이터를 저장할 버퍼를 만듭니다.
- OutputStreamWriter로 래핑: baos 객체를 생성자에 전달하여 문자 기반 쓰기를 가능하게 합니다.
- 문자 작성: write() 메서드를 통해 문자열의 각 문자를 순차적으로 기록합니다.
- 스트림 닫기: close()를 호출하여 버퍼를 비우고 리소스를 해제합니다.
- 바이트 배열 변환: toByteArray()로 결과를 확인합니다.
실행 결과
84 85 84 79 82 73 65 76 83 80 79 73 78 84
출력된 숫자들은 각각 'T', 'U', 'T', 'O', 'R', 'I', 'A', 'L', 'S', 'P', 'O', 'I', 'N', 'T' 문자에 해당하는 ASCII 코드 값입니다. 즉, 문자 데이터가 정상적으로 바이트로 인코딩되었음을 의미합니다.
정리
Java에서 OutputStream을 Writer로 변환할 때는 OutputStreamWriter가 가장 표준적인 방법입니다. 특히 파일이나 네트워크 소켓처럼 바이트 기반 출력 대상에 텍스트를 작성해야 할 때 유용하게 활용할 수 있으며, UTF-8 등 원하는 문자 인코딩을 명시적으로 지정할 수도 있다는 점이 큰 장점입니다.