[이것이 자바다] 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/BufferedOutputStreamBufferedReader/BufferedWriter- 필수 사용 권장: 입출력 속도가 획기적으로 빨라집니다.
- 특히
BufferedReader는readLine()메소드를 제공하여 줄 단위 읽기가 가능합니다.
- 특히
문자 변환
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) 누락을 방지합니다.
감사합니다.
'Language > JAVA' 카테고리의 다른 글
| [이것이 자바다].ch18.네트워크 입출력 (0) | 2026.01.02 |
|---|---|
| [이것이 자바다].ch16.스트림 요소 처리 (0) | 2026.01.01 |
| [이것이 자바다].ch15.람다식 (0) | 2026.01.01 |
| [이것이 자바다].ch14.컬렉션 (0) | 2025.12.30 |
| [이것이 자바다].ch13.스레드 (0) | 2025.12.30 |