문자 스트림(Character Stream)이란?
자바의 문자 스트림(Character Stream)은 16비트 유니코드(Unicode) 단위로 데이터를 입출력하는 스트림입니다. 바이트 스트림과 달리 텍스트 데이터 전용으로 사용되며, 한글처럼 멀티바이트 문자를 포함한 다양한 언어의 텍스트를 안전하게 읽고 쓸 수 있다는 장점이 있습니다.
모든 문자 스트림 클래스는 추상 클래스인 Reader(입력)와 Writer(출력)를 최상위 부모로 가집니다. 자바에서 기본 제공하는 대표적인 문자 스트림 클래스는 아래 표와 같습니다.
| Reader (입력) | Writer (출력) |
|---|---|
| BufferedReader | BufferedWriter |
| CharArrayReader | CharArrayWriter |
| StringReader | StringWriter |
| InputStreamReader | OutputStreamWriter |
| FileReader | FileWriter |
각 클래스의 역할을 간단히 살펴보면 다음과 같습니다.
- BufferedReader / BufferedWriter : 내부 버퍼를 활용해 입출력 성능을 크게 향상시킵니다.
- CharArrayReader / CharArrayWriter : 메모리상의 char 배열을 대상으로 읽기·쓰기를 수행합니다.
- StringReader / StringWriter : 문자열(String)을 스트림처럼 다룰 수 있게 해줍니다.
- InputStreamReader / OutputStreamWriter : 바이트 스트림과 문자 스트림 사이의 다리 역할을 하며, 문자 인코딩 변환도 지원합니다.
- FileReader / FileWriter : 파일에서 문자 데이터를 직접 읽고 쓰는 가장 기본적인 클래스입니다.
예제: FileReader와 FileWriter로 파일 복사하기
다음 자바 프로그램은 FileReader로 특정 파일의 내용을 읽어 들인 뒤, FileWriter를 사용해 다른 파일에 그대로 기록합니다.
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class IOStreamsExample {
public static void main(String args[]) throws IOException {
// FileReader 객체 생성
File file = new File("D:/myFile.txt");
FileReader reader = new FileReader(file);
char chars[] = new char[(int) file.length()];
// 파일에서 데이터 읽기
reader.read(chars);
// 출력용 파일 생성
File out = new File("D:/CopyOfmyFile.txt");
FileWriter writer = new FileWriter(out);
// 다른 파일에 데이터 쓰기
writer.write(chars);
writer.flush();
System.out.println("Data successfully written in the specified file");
}
}실행 결과
Data successfully written in the specified file
프로그램이 정상적으로 실행되면 원본 파일(myFile.txt)의 전체 내용이 CopyOfmyFile.txt에 복사되고, 콘솔에 위와 같은 완료 메시지가 출력됩니다.
실무 팁
flush()는 버퍼에 남아 있는 데이터를 강제로 파일에 기록하는 메서드입니다. 스트림을 닫기 전에 호출해야 데이터 손실을 방지할 수 있습니다.- 사용이 끝난 스트림은 반드시
close()로 닫아야 시스템 리소스 누수를 막을 수 있습니다. - Java 7 이상에서는 try-with-resources 문법을 활용하면 스트림 닫기를 자동으로 처리할 수 있어 더욱 안전합니다.