자바 IO
자바에서는 특정 장치와의 연결을 직접 담당하지 않고 스트림을 통해 입출력을 처리한다
기본적으로 java.io
패키지의 클래스들을 사용한다
- 스트림은 입출력 장치와 자바 프로그램간의 연결 통로임
- 단방향 이므로 입력 스트림과 출력 스트림을 별도로 사용해야 함
- 연속된 데이터의 흐름으로 입출력 진행시 다른 작업을 할 수 없는 블로킹(Blocking) 상태가 됨
- 입출력 대상을 변경하기 편하며 동일한 프로그램 구조를 유지할 수 있음
- 문자 스트림과 바이트 스트림으로 구분
바이트 스트림(Byte Stream)
- binary 데이터를 입출력하는 스트림
- 데이터는 1바이트 단위로 처리됨
- 이미지, 동영상등을 송수신할 때 사용
- 주요 라이브러리는 InputStream, OutputStream 형태의 클래스 이름 사용
문자 스트림(Character Stream)
- text 데이터를 입출력하는 스트림
- 데이터는 2바이트 단위로 처리됨
- 일반적인 텍스트 및 JSON , HTML 등을 송수신할 때 사용
- 주요 라이브러리는 Reader , Writer 형태의 클래스 이름 사용
보조 스트림
보조 스트림은 FilterInputStream
과 FilterOutputStream
을 상속받는 클래스들로 기본 스트림과 결합하여 특정 상황에서 보다 편리하게 사용 가능
BufferedInputStream/BufferedOutputStream
: 버퍼를 사용해 입출력 효율과 편의를 위해 사용
BufferReader/BufferWriter
: 라인 단위의 입출력이 편리함
InputStreamReader/OutputStreamReader
: 바이트 스트림을 문자 스트림처럼 쓸 수 있도록하며 문자 인코딩 변환을 지원
DataInputStream/DataOutputStream
: 자바 원시자료형 데이터 처리에 적합


- 첫번째 실행은 기본 read() 메서드를 사용한 결과로 여러 글자를 입력해도 처음하나 출력
- 영문의 경우 System.out.println()으로 출력시 아스키 코드 값이 출력됨
- 한글의 경우 출력되지 않음
- 두번째와 세번째 실행은 첫번째 실행 블럭을 주석처리하고 원래 주석처리된 코드의 주석을 제거하고 다시 실행
- 세글자 까지 입력 내용이 출력되며 한글의 경우에도 정상 출력됨(UTF-8은 3바이트)
- 입력내용을 모두 처리하려면 반복해서 읽도록 해야 하므로 처리가 불편