Java 입력 스트림: InputStream, InputStreamReader, BufferedReader의 차이와 사용법

Yunsung·2025년 1월 2일
post-thumbnail

Java에서 데이터를 읽는 방법은 매우 다양합니다. 특히 표준 입력(System.in)이나 파일 입력을 처리할 때 자주 사용하는 클래스인 InputStream, InputStreamReader, 그리고 BufferedReader는 각기 다른 역할과 특징을 가지고 있습니다. 이번 글에서는 이 세 클래스의 차이점과 사용 예제를 통해 언제 어떤 클래스를 사용해야 하는지 알아보겠습니다.


1. 📚 세 클래스의 역할과 차이점

1.1. InputStream

  • 기능: 바이트 단위 데이터를 읽습니다.
  • 특징: 데이터를 바이트 단위로 읽기 때문에, 텍스트보다는 이미지나 바이너리 데이터를 처리할 때 주로 사용됩니다.
  • 처리 단위: 바이트 단위
  • 효율성: 낮음 (버퍼링 없이 데이터를 한 번에 하나씩 읽음)
  • 주요 메서드: read(), read(byte[] b)

1.2. InputStreamReader

  • 기능: 바이트 데이터를 문자 데이터로 변환합니다.
  • 특징: InputStream에서 읽어온 바이트 데이터를 특정 문자 인코딩(UTF-8)으로 변환하여 문자로 처리할 수 있습니다.
  • 처리 단위: 문자 단위
  • 효율성: 중간 (버퍼링 없이 작동)
  • 주요 메서드: read(), close()

1.3. BufferedReader

  • 기능: 문자 데이터를 버퍼링하여 효율적으로 읽습니다.
  • 특징: 내부적으로 데이터를 버퍼링하여 대량의 데이터를 처리할 때 성능을 크게 향상시킵니다. 특히, readLine() 메서드를 사용하여 줄 단위 데이터를 읽을 수 있습니다.
  • 처리 단위: 문자 단위, 줄 단위 (readLine)
  • 효율성: 높음 (버퍼링으로 성능 최적화)
  • 주요 메서드: readLine(), close()

1.4 요약 표

특징InputStreamInputStreamReaderBufferedReader
기능바이트 단위 데이터 읽기바이트 -> 문자 변환문자 데이터를 버퍼링하며 읽기
처리 단위바이트 단위문자 단위문자 단위, 줄 단위(readLine)
효율성낮음중간높음
주요 메서드read()read()readLine()

2. 사용 예제

2.1 InputStream: 바이트 단위 읽기

InputStream은 데이터를 바이트 단위로 처리하기 때문에, 텍스트 데이터를 읽을 때 비효율적입니다.(한글 입력시 깨짐 발생!)

import java.io.*;

public class InputStreamExample {
    public static void main(String[] args) throws IOException {
        InputStream is = System.in;
        System.out.print("입력하세요: ");
        int data = is.read(); // 한 바이트만 읽음
        System.out.println("입력한 데이터 (ASCII): " + data);
        System.out.println("입력한 문자: " + (char) data);
    }
}

출력 결과(입력: A)

입력한 데이터 (ASCII): 65
입력한 문자: A

2.2 InputStreamReader: 문자로 변환

InputStreamReader를 사용하면 바이트 데이터를 문자로 변환하여 읽을 수 있습니다.(한글은 읽을 수 있지만 문자열은 읽을 수 없음)

import java.io.*;

public class InputStreamReaderExample {
    public static void main(String[] args) throws IOException {
        InputStreamReader isr = new InputStreamReader(System.in);
        System.out.print("입력하세요: ");
        int data = isr.read(); // 한 문자만 읽음
        System.out.println("입력한 문자: " + (char) data);
    }
}

출력 결과(입력: )

입력한 문자: 가

2.3 BufferedReader: 줄 단위 처리

BufferedReader는 줄 단위로 데이터를 읽을 수 있어 가장 효율적이고 사용하기 편리합니다.

import java.io.*;

public class BufferedReaderExample {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.print("입력하세요: ");
        String line = br.readLine(); // 한 줄 읽기
        System.out.println("입력한 내용: " + line);
    }
}

출력 결과(입력: 안녕하세요!)

입력한 내용: 안녕하세요!

3. 언제 어떤 것을 사용해야 할까?

상황사용 클래스
바이트 데이터를 읽을 때InputStream
문자 데이터를 읽을 때(인코딩 필요)InputStreamReader
대량의 텍스트 데이터를 처리할 때BufferedReader
profile
풀스택 개발자로서의 도전을 하는 중입니다. 많은 응원 부탁드립니다!!😁

0개의 댓글