JAVA

태태개발일지 - Java 파일 입출력 완전 정리

태태코 2025. 12. 1. 17:40
반응형

 

 

회사에서 기존에 고용노동부 퇴직연금시스템 파일 로직 점검에 이어서 운용사 선정 페이지 파일 로직 점검 업무를 받았다.

기존 고용노동부 시스템은 전자정부 프레임워크라, jdk와 java 버전이 낮아서, 좀더 간편하고 성능좋은게 있을 까 강의를 들어봤다.

파일 시스템 라이브러리와 클래스 자체는 변한게 없는 것 같은데. 상황에 따라 어떤 것을 사용하는 것이 좋은 지 좋은 지식이 되었다.

 

바이트 스트림 vs 문자 스트림

 

바이트 스트림 (Byte Stream)

  • FileInputStream / FileOutputStream
  • 데이터를 바이트 단위로 읽고 쓴다.
  • 이미지, 동영상, 바이너리 파일, PDF 등 텍스트가 아닌 파일 처리에 적합.

 

문자 스트림 (Character Stream)

  • FileReader / FileWriter
  • 텍스트 파일을 문자 단위(2바이트)로 읽고 쓴다.
  • 내부적으로 OS 기본 인코딩을 사용해 바이트 → 문자 변환 수행.

 

InputStreamReader

바이트 스트림을 문자 스트림으로 변환하는 “다리”

 

 

InputStreamReader와 OutputStreamWriter는 “브릿지(bridge) 스트림”이라고 부른다.

 

 

역할

  • 바이트 스트림(InputStream)을 입력받아 → 문자로 변환
  • 이때 개발자가 직접 문자 인코딩을 지정할 수 있어 매우 중요한 클래스
InputStreamReader reader = new InputStreamReader(
        new FileInputStream("test.txt"), "UTF-8"
);

 

 

FileReader vs InputStreamReader(+FileInputStream)

 

둘 다 "바이트 → 문자" 변환을 하는데 왜 굳이 InputStreamReader를 쓰는가?

 

 

FileReader의 문제점

FileReader는 내부적으로 OS의 기본 문자 인코딩을 사용한다.

 

예를 들어:

  • Windows 기본 인코딩: MS949(CP949)
  • 파일 인코딩: UTF-8

이런 상황이면 한글 깨짐이 발생한다.

 

 InputStreamReader를 사용하는 이유

  • 개발자가 직접 인코딩 지정 가능
  • UTF-8, EUC-KR 등 필요한 인코딩 정확히 선택 가능
new InputStreamReader(new FileInputStream("test.txt"), "UTF-8");

 

BufferedReader / BufferedWriter로 성능 개선

Buffered 스트림이 필요한 이유

스트림은 기본적으로 1바이트(또는 1문자) 단위로 읽기/쓰기 때문에 성능이 좋지 않을 수 있다.

그래서 Java에서는 내부에 버퍼(buffer)를 둬서 대량 데이터를 한 번에 처리하는 BufferedReader / BufferedWriter를 제공한다.

 

 

 

BufferedStream의 동작 원리

 

입력(InputStream)의 경우

  1. OS로부터 큰 크기(버퍼 크기만큼)를 한 번에 읽어 저장
  2. 프로그램은 버퍼에서 조금씩 읽음
  3. 버퍼가 비면 다시 OS에 요청하여 보충

출력(OutputStream)의 경우

  1. 프로그램이 버퍼에 데이터를 채움
  2. 버퍼가 가득 차면 한 번에 OS로 전달하여 파일에 기록

즉, 시스템 호출 횟수를 줄여 성능이 향상됨

 

 

Buffered 스트림의 단점: 동기화 오버헤드

 

Buffered 스트림은 내부적으로 동기화(synchronized) 처리가 되어 있다.

  • 멀티스레드 환경에서 안전하지만
  • 단일 스레드 상황에서는 오히려 불필요한 동기화 때문에 성능이 떨어지는 경우도 존재합니다.

즉, 상황에 따라 성능 차이가 날수 있다.

 

스트림 특징 인코딩 지정 용도

FileInputStream 바이트 단위 × 이미지, 바이너리 파일
FileReader 문자 단위 × (OS 기본 인코딩) 텍스트(단, 인코딩 깨짐 위험)
InputStreamReader 문자 단위 O UTF-8 등 파일 인코딩 명시
BufferedReader 버퍼 사용 인코딩 X (Reader 필요) 대용량 텍스트 읽기
BufferedWriter 버퍼 사용 인코딩 X 대용량 텍스트 쓰기

 

반응형