
데이터를 1 byte 단위로 처리
텍스트, 이미지, 영상 등 모든 종류의 파일 처리 가능
입력 xxxInputStream
InputStream,FileInputStream
출력 xxxOutputStream
OutputStream,FileOutputStream
데이터를 한 문자(char) 단위로 처리
텍스트 파일, 특히 한글 같은 유니코드 문자를 안정적으로 처리
내부적으로 바이트를 문자로 변환(인코딩 처리)함
입력 xxxReader
Reader,InputStreamReader,FileReader
출력 xxxWriter
Writer,OutputStreamWriter,FileWriter
버퍼(buffer)는 스트림이 아니고, 스트림에 “얹는” 보조 역할
하나 씩 입출력하면 비효율적
➡ 입출력 성능 향상을 위해 버퍼를 사용하여
한 번에 여러 바이트/문자를 처리
내부적으로 메모리 버퍼(임시 저장 공간)를 사용
보조 스트림 (기존 스트림을 감싸서 기능 향상)
👉 근본 스트림 + 기능 추가
| 구분 | 바이트 기반 | 문자 기반 |
|---|---|---|
| 입력 스트림 | BufferedInputStream | BufferedReader |
| 출력 스트림 | BufferedOutputStream | BufferedWriter |
readLine() 메서드는 \n 기준으로 한 줄 읽음
🔗 스트림 체인 == 빨대를 하나씩 덧대는 구조 🥤
효율적인 텍스트 데이터 읽기를 위해
3단계에 걸쳐 스트림을 업그레이드 하자!
FileInputStream : 파일에서 바이트 단위로 읽기 (근본 스트림)
⬇
InputStreamReader : 바이트 → 문자 단위로 변환 (문자 스트림)
⬇
BufferedReader : 성능 향상 + readLine() 지원 (보조 스트림)
package com.sinse.ioproject;
import java.io.*;
public class StreamTuning {
FileInputStream fis; // 1단계: 바이트 기반 입력 스트림
InputStreamReader reader; // 2단계: 문자 변환 스트림 (인코딩 처리 가능)
BufferedReader buffr; // 3단계: 버퍼 + readLine() 제공하는 보조 스트림
// 읽어들일 파일 경로
String name = "C:/.../res/memo.txt";
public StreamTuning() {
try {
// 스트림 계층적으로 연결
fis = new FileInputStream(name); // 파일에서 바이트 입력
reader = new InputStreamReader(fis); // 바이트 → 문자 변환
buffr = new BufferedReader(reader); // 줄 단위 읽기 + 성능 향상
String data = null; // 읽은 한 줄 저장용
int count = 0; // 읽은 줄 수 카운트
// 파일 끝(null)까지 한 줄씩 읽기
while ((data = buffr.readLine()) != null) {
System.out.println(data);
count++;
}
System.out.println("총 읽은 줄 수: " + count);
} catch (FileNotFoundException e) {
System.err.println("파일을 찾을 수 없습니다.");
e.printStackTrace();
} catch (IOException e) {
System.err.println("파일 읽기 중 오류 발생");
e.printStackTrace();
} finally {
// 자원 해제 (가장 바깥쪽 스트림만 닫아도 내부 스트림들 자동으로 닫힘)
try {
if (buffr != null) buffr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new StreamTuning();
}
}
System 클래스가 표준 입출력 스트림들을 제공| 구분 | 역할 | 스트림 객체 |
|---|---|---|
| 입력 | 키보드 | System.in |
| 출력 | 모니터 (표준 출력) | System.out |
| 에러 출력 | 모니터 (에러) | System.err |
⚠ 주의) 사용 후 우리 것이 아니므로 닫지 않는다!
read()💬 채팅만들 때 유용하게 쓰인다고 하니 잘 알아두자!