반응형

회사에서 기존에 고용노동부 퇴직연금시스템 파일 로직 점검에 이어서 운용사 선정 페이지 파일 로직 점검 업무를 받았다.
기존 고용노동부 시스템은 전자정부 프레임워크라, 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)의 경우
- OS로부터 큰 크기(버퍼 크기만큼)를 한 번에 읽어 저장
- 프로그램은 버퍼에서 조금씩 읽음
- 버퍼가 비면 다시 OS에 요청하여 보충
출력(OutputStream)의 경우
- 프로그램이 버퍼에 데이터를 채움
- 버퍼가 가득 차면 한 번에 OS로 전달하여 파일에 기록
➡ 즉, 시스템 호출 횟수를 줄여 성능이 향상됨
Buffered 스트림의 단점: 동기화 오버헤드
Buffered 스트림은 내부적으로 동기화(synchronized) 처리가 되어 있다.
- 멀티스레드 환경에서 안전하지만
- 단일 스레드 상황에서는 오히려 불필요한 동기화 때문에 성능이 떨어지는 경우도 존재합니다.
즉, 상황에 따라 성능 차이가 날수 있다.
스트림 특징 인코딩 지정 용도
| FileInputStream | 바이트 단위 | × | 이미지, 바이너리 파일 |
| FileReader | 문자 단위 | × (OS 기본 인코딩) | 텍스트(단, 인코딩 깨짐 위험) |
| InputStreamReader | 문자 단위 | O | UTF-8 등 파일 인코딩 명시 |
| BufferedReader | 버퍼 사용 | 인코딩 X (Reader 필요) | 대용량 텍스트 읽기 |
| BufferedWriter | 버퍼 사용 | 인코딩 X | 대용량 텍스트 쓰기 |

반응형
'JAVA' 카테고리의 다른 글
| 태태개발일지 - 김영한 java 고급 (람다) 람다 총정리 (0) | 2025.09.05 |
|---|---|
| 태태개발일지 - 김영한 java 고급 디폴트 메서드 (3) | 2025.08.11 |
| 태태코딩 - 김영한 고급 java 람다 (1) | 2025.07.29 |
| 태태개발일지 - 김영한 고급 JAVA LAMBDA (2) | 2025.07.28 |
| 태태개발일지 - flatMap (2) | 2025.07.08 |