데이터 처리 방식에 따른 Stream 분류

heeezni·2025년 5월 23일
post-thumbnail

스트림의 분류

1) 방향에 따른 분류

  • 입력
  • 출력

2) 데이터 처리방법에 따른 분류 ✅

  • 바이트(근본) : 1byte씩
  • 문자 : 1문자씩 (문자 이해 스트림)
  • 버퍼기반

✅ 데이터 처리 방식에 따른 Stream 분류

1) 바이트 기반 스트림 (근본)

  • 데이터를 1 byte 단위로 처리

  • 텍스트, 이미지, 영상 등 모든 종류의 파일 처리 가능

입력 xxxInputStream
InputStream, FileInputStream

출력 xxxOutputStream
OutputStream, FileOutputStream

2) 문자 기반 스트림

  • 데이터를 한 문자(char) 단위로 처리

  • 텍스트 파일, 특히 한글 같은 유니코드 문자를 안정적으로 처리

  • 내부적으로 바이트를 문자로 변환(인코딩 처리)

입력 xxxReader
Reader, InputStreamReader, FileReader

출력 xxxWriter
Writer, OutputStreamWriter, FileWriter

3) Buffered 보조 스트림

  • 버퍼(buffer)는 스트림이 아니고, 스트림에 “얹는” 보조 역할

  • 하나 씩 입출력하면 비효율적
    ➡ 입출력 성능 향상을 위해 버퍼를 사용하여
    한 번에 여러 바이트/문자를 처리

  • 내부적으로 메모리 버퍼(임시 저장 공간)를 사용

  • 보조 스트림 (기존 스트림을 감싸서 기능 향상)
    👉 근본 스트림 + 기능 추가

구분바이트 기반문자 기반
입력 스트림BufferedInputStreamBufferedReader
출력 스트림BufferedOutputStreamBufferedWriter

readLine() 메서드는 \n 기준으로 한 줄 읽음


3단계 스트림 체인

🔗 스트림 체인 == 빨대를 하나씩 덧대는 구조 🥤

효율적인 텍스트 데이터 읽기를 위해
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 클래스가 표준 입출력 스트림들을 제공
  • OS에서 기본 제공하는 입력 장치 (키보드)의 입력 스트림
  • 개발자가 생성/관리할 필요 없음 (이미 준비되어 있음)
  • 바이트 기반 스트림이므로 문자 입력 처리에는 InputStreamReader 필요
구분역할스트림 객체
입력키보드System.in
출력모니터 (표준 출력)System.out
에러 출력모니터 (에러)System.err

⚠ 주의) 사용 후 우리 것이 아니므로 닫지 않는다!

read()

  • 입력(키보드)이 들어오기 전까지 대기함 → Blocking 메서드
  • 사용자가 엔터를 칠 때까지 실행 흐름이 멈춰 있음
  • 무한 반복문에 사용가능 (입력이 있을 때마다 한 문자씩 처리 가능)

💬 채팅만들 때 유용하게 쓰인다고 하니 잘 알아두자!

profile
아이들의 가능성을 믿었던 마음 그대로, 이제는 나의 가능성을 믿고 나아가는 중입니다.🌱

0개의 댓글