Language/JAVA

[이것이 자바다].ch17.데이터 입출력

JSJH._. 2026. 1. 2. 15:41

[이것이 자바다] 17. 데이터 입출력

안녕하세요. 이번에는 자바의 데이터 입출력에 대해 정리한 내용입니다.


1. 입출력 스트림(Stream)

  • 스트림(Stream): 프로그램과 외부 장치(파일, 네트워크 등) 사이에서 데이터가 흐르는 단방향 통로입니다.
  • InputStream: 외부에서 프로그램으로 읽어오는 통로
  • OutputStream: 프로그램에서 외부로 내보내는 통로

2. 바이트 스트림 vs 문자 스트림

자바는 데이터를 다루는 기준에 따라 두 가지 종류의 스트림을 제공합니다.

바이트 스트림 (Byte Stream)

  • 단위: 1바이트(byte)
  • 최상위 클래스: InputStream, OutputStream
  • 용도: 이미지, 동영상, 실행 파일 등 모든 종류의 파일 처리 가능합니다.
  • 구현 클래스: FileInputStream, FileOutputStream

문자 스트림 (Character Stream)

  • 단위: 2바이트 문자(char)
  • 최상위 클래스: Reader, Writer
  • 용도: 텍스트 파일(.txt, .java 등)만 전문적으로 다룰 때 사용합니다. 인코딩 문제를 알아서 처리해주어 편리합니다.
  • 구현 클래스: FileReader, FileWriter

3. 보조 스트림

  • 주 스트림(FileInputStream 등)에 연결하여 기능을 추가하거나 성능을 높이는 역할을 합니다.
  • new 보조스트림(주스트림) 형태로 감싸서 사용합니다.

성능 향상 (버퍼)

  • BufferedInputStream / BufferedOutputStream
  • BufferedReader / BufferedWriter
  • 필수 사용 권장: 입출력 속도가 획기적으로 빨라집니다.
    • 특히 BufferedReaderreadLine() 메소드를 제공하여 줄 단위 읽기가 가능합니다.

문자 변환

  • InputStreamReader / OutputStreamWriter
  • 바이트 스트림을 문자 스트림으로 변환해줍니다. (예: System.in은 바이트 스트림이라 한글 입력 시 깨지므로 InputStreamReader로 감싸서 사용)

객체 직렬화 (Serialization)

  • ObjectInputStream / ObjectOutputStream
  • 객체 자체를 파일에 저장하거나 네트워크로 보낼 때 사용합니다.
  • 주의: 직렬화하려는 클래스는 반드시 implements Serializable 해야 합니다.

4. File과 Files 클래스

  • File 클래스: 파일이나 디렉토리의 경로를 객체로 표현하고, 생성/삭제/목록보기 등의 기능을 제공합니다.
  • Files 클래스 (Java 7+): File보다 더 강력하고 편리한 기능을 제공하는 유틸리티 클래스입니다. (Files.copy, Files.readString 등)

5. 파일 복사 예제 (try-with-resources)

자바 7부터 지원하는 try-with-resources 구문을 사용하면 close()를 직접 호출하지 않아도 자동으로 자원이 해제되어 안전합니다.

import java.io.*;

public class CopyExample {
    public static void main(String[] args) {
        String src = "C:/Temp/original.txt";
        String dst = "C:/Temp/copy.txt";

        // try(...) 안에 스트림을 선언하면 자동 close 됨
        try (
            BufferedReader br = new BufferedReader(new FileReader(src));
            BufferedWriter bw = new BufferedWriter(new FileWriter(dst))
        ) {
            String line;
            // 한 줄씩 읽어서 쓰기
            while ((line = br.readLine()) != null) {
                bw.write(line);
                bw.newLine(); // 줄바꿈
            }
            System.out.println("복사 완료!");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

핵심 포인트

  • 텍스트 파일은 문자 스트림(Reader/Writer), 그 외(이미지 등)는 바이트 스트림을 사용합니다.
  • 속도 향상을 위해 보조 스트림(Buffered...)은 선택이 아닌 필수입니다.
  • try-with-resources를 사용하여 자원 해제(close) 누락을 방지합니다.

감사합니다.