18.6 문자 변환 스트림

바이트 스트림 (InputStream, OutputStream)에서 입출력할 데이터가 문자라면 문자 스트림 (Reader, Writer)으로 변환해서 사용하는 것이 좋다.

문자 변환 스트림 시각화 (돼지코 변환 어댑터 비유)

flowchart LR
    subgraph Bytes [바이트(Byte) 데이터]
        Data1[01010100...]
    end
    
    Converter{문자 변환 스트림\n(InputStreamReader/ \nOutputStreamWriter)}
    
    subgraph Chars [문자(Char) 데이터]
        Data2["'A', '가', '한'"]
    end
    
    Bytes -->|바이트 읽기| Converter
    Converter -->|문자로 조립해서 전달| Chars
    
    style Bytes fill:#dae8fc,stroke:#6c8ebf
    style Converter fill:#fff2cc,stroke:#d6b656,stroke-width:2px
    style Chars fill:#d5e8d4,stroke:#82b366

InputStream을 Reader로 변환

InputStream is = new FileInputStream("C:/Temp/test.txt");
Reader reader = new InputStreamReader(is);

OutputStream을 Writer로 변환

OutputStream os = new FileOutputStream("C:/Temp/test.txt");
Writer writer = new OutputStreamWriter(os);

다음 예제는 UTF-8 문자셋으로 파일에 문자를 저장하고, 저장된 문자를 다시 읽는다.

package ch18.sec06;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;

public class CharacterConvertStreamExample {
	public static void main(String[] args) throws Exception {
		write("문자 변환 스트림을 사용합니다.");
		String data = read();
		System.out.println(data);
	}

	public static void write(String str) throws Exception {
		OutputStream os = new FileOutputStream("C:/Temp/test.txt");
		Writer writer = new OutputStreamWriter(os, "UTF-8");
		writer.write(str);
		writer.flush();
		writer.close();
	}

	public static String read() throws Exception {
		InputStream is = new FileInputStream("C:/Temp/test.txt");
		Reader reader = new InputStreamReader(is, "UTF-8");
		char[] data = new char[100];
		int num = reader.read(data);
		reader.close();
		String str = new String(data, 0, num);
		return str;
	}
}
서브목차