개발/Java

[Java] 자바 입출력 - 바이트 스트림과 문자 스트림이란?

선우. 2024. 6. 25. 19:35

1. 바이트 스트림 & 문자 스트림

바이트 스트림

  • Byte Stream은 데이터를 Byte 단위로 처리합니다.
  • 모든 종류의 파일 (텍스트, 이미지, 비디오 등) 데이터를 처리합니다.
  • InputStream, OutputStream 클래스는 모든 바이트 기반 입출력 스트림의 최상위 추상 클래스입니다.

문자 스트림

  • Character Stream은 데이터를 Character 단위로 처리합니다.
  • 주로 텍스트 파일 데이터를 처리합니다.
  • Reader, Writer 클래스는 모든 문자 기반 입출력 스트림의 최상위 추상 클래스입니다.

 

2. InputStreamReader & OutputStreamWriter

  • InputStreamReader는 바이트 입력 스트림을 문자 입력 스트림으로 변환합니다.
  • OutputStreamWriter는 바이트 출력 스트림을 문자 출력 스트림으로 변환합니다.

 

3. BufferedReader & BufferedWriter

  • BufferedReader와 BufferedWriter는 문자 입출력 스트림에 버퍼링 기능을 추가한 클래스입니다.
  • 내부적으로 버퍼를 사용해 스트림에서 데이터를 큰 덩어리로 읽거나 출력합니다. 각 문자를 개별적으로 처리하는 것 보다 입출력(I/O) 작업 횟수를 줄여 성능이 향상됩니다.

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
  • System.in과 System.out은 바이트 스트림입니다. (더 정확히는 System.out은 OutputStream을 확장한 PrintStream입니다.)
  • InputStreamReader와 OutputStreamWriter는 문자 스트림으로, 바이트 스트림을 문자 스트림으로 변환합니다.
  • BufferedReader와 BufferedWriter는 문자 스트림으로, 문자 스트림에 버퍼링 기능을 추가했습니다.

 

4. Scanner vs. BufferedReader

Buffer 사용 여부

  • Scanner는 버퍼를 사용하지 않고 직접 입력 스트림에서 데이터를 읽어옵니다. 이는 읽기 연산 마다 I/O 작업 횟수가 늘어나 성능에 부정적인 영향을 미칠 수 있습니다.
  • BufferedReader는 버퍼를 사용해 입력 스트림에서 데이터를 한 번에 읽어옵니다. 읽기 연산 마다 버퍼에서 데이터를 읽어오기 때문에 I/O 작업 횟수가 줄어들어 성능이 향상됩니다.

데이터 처리 방식

  • Scanner는 입력 데이터를 파싱해 원하는 타입으로 변환할 수 있는 유연성을 제공합니다.
  • BufferedReader는 데이터를 텍스트로 읽어옵니다.

결론

입출력 성능이 중요할 경우 BufferedReader를 사용하는 것이 좋습니다. 반면 데이터 형식이 유연하게 처리되어야 할 경우 Scanner를 사용하는 것이 좋습니다.