스트림
- 데이터 흐름을 의미
- 파일 또는 각종 I/O 장치와의 데이터 이동에 사용되는 인스턴스를 가리킨다
- 스트림은 Input Stream, Output Stream으로 나뉨
- 데이터를 읽어 들이는 과정이 끝나면 생성한 스트림은 소멸해야함
자바 NIO(New IO)
기존에 자바 IO API를 대체하기 위해 자바 1.4에 도입
NIO 주요 구성요소
- Channels
- Buffer
- Selectors
Channels
NIO는 모든 IO는 채널로 시작
Channel은 Buffer를 통해서만 데이터를 읽고 쓸 수 있다.
양방향이기때문에 ByteChannel, FileChannel을 만들어서 사용.
NIO의 경우 Non-blocking을 지원한다.
참고(java NIO와 멀티플렉싱 기반의 다중 접속 서버)
참고(java NIO는 생각만큼 non-blocking 하지 않다)
버퍼(Buffer)
읽고 쓰기가 가능한 메모리 배열
구분 | 특징 |
Direct buffer | 운영체제 메모리 버퍼 생성 느림 버퍼의 크기 큼 입출력 성능 높음 |
None direct buffer | JVM heap memory 버퍼 생성 빠름 버퍼 크기가 작음 입출력 성능 낮음 |
Byte
byte 형으로 표현할 수 있는 데이터의 수는 2진수로 00000000부터 1111111까지 총 256개.
더 이상 읽어들일 데이터가 존재하지 않는 상황에서 반환되는 -1을 표현할 수 없기때문에 int로 표현
Input Stream
바이트 기반 입력 스트림의 최상위 추상 클래스, byte stream의 경우 InputStream을 상속받아 사용
read()
1타이트를 읽고 바이트를 리턴함
read(byte[] b)
입력 스트림으로부터 매개값으로 주어진 바이트 배열 b에 저장하고 실제 읽은 byte 수를 리턴함
read(byte[] b, int off, int len)
close()
시스템 자원을 반납하고 입력 스트림을 닫음
Output Stream
바이트 기반 출력 스트림의 최상위 추상클래스. 출력 기반 byte stream의 경우 OutputStream을 상속받아 사용
write(int b)
출력 스트림으로부터 1바이트를 출력
write(byte[] b)
출력 스트림으로부터 주어진 바이트 배열 b의 모든 바이트를 출력
flush()
버퍼에 잔류하는 모든 바이트 출력
close()
사용한 시스템 자원 반납하고, 출력 스트림 닫음
Byte Stream
- byte 단위로 주고 받는 stream
- 바이트가 적절하게 변환되면 의미있는 데이터가 된다(text, zip, image)
- 1byte 단위로 처리
Character Stream
- Byte를 Stream에서 재해석해 가공하는 것
- 2byte, 1byte를 인코딩에 따라 사용
- 자바에서 사용하는 문자방식은 Unicode
표준 스트림 (System.in, System.out, System.err)
Java에서 스크린, 키보드를 통한 입출력 표준을 제공한다.
java.lang.System에서 표준 입출력을 제공하며 in, out, err를 이용해 표준입력, 표준에러, 표준 에러 제공
System 클래스는 JVM의 표준 장치를 가리키는 클래스이다.
- System.in : JVM이 메모리에 올라오면서 미리 객체에 접근하게 됨.
- System.out : 표준 출력 장치 객체
- System.err: 표준 에러 출력 장치 의미. 정상출력은 System.out으로 오류가 발생할 때 출력은 System.err를 이용
파일 읽기 쓰기