Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 문자 스트림 완벽 가이드 – Reader·Writer 클래스와 파일 복사 예제


문자 스트림(Character Stream)이란?

자바의 문자 스트림(Character Stream)은 16비트 유니코드(Unicode) 단위로 데이터를 입출력하는 스트림입니다. 바이트 스트림과 달리 텍스트 데이터 전용으로 사용되며, 한글처럼 멀티바이트 문자를 포함한 다양한 언어의 텍스트를 안전하게 읽고 쓸 수 있다는 장점이 있습니다.

모든 문자 스트림 클래스는 추상 클래스인 Reader(입력)와 Writer(출력)를 최상위 부모로 가집니다. 자바에서 기본 제공하는 대표적인 문자 스트림 클래스는 아래 표와 같습니다.

Reader (입력)Writer (출력)
BufferedReaderBufferedWriter
CharArrayReaderCharArrayWriter
StringReaderStringWriter
InputStreamReaderOutputStreamWriter
FileReaderFileWriter

각 클래스의 역할을 간단히 살펴보면 다음과 같습니다.

  • 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 문법을 활용하면 스트림 닫기를 자동으로 처리할 수 있어 더욱 안전합니다.