[Day15 - JAVA] chap14. 입출력
1.1 입출력과 스트림
입출력(I/O)이란?
: 입력(Input)과 출력(Output)을 줄여 부르는 말
: 두 대상 간의 데이터를 주고 받는 것
스트림(stream)이란?
: 데이터를 운반하는데 사용되는 연결 통로
: 연속적인 데이터의 흐름을 물(stream)에 비유해서 붙여진 이름
: 하나의 스트림으로 입출력을 동시에 할 수 없는 단방향 통신 >> 입출력 동시 출력을 위해 2개의 스트림 필요
1.2 스트림
1) 바이트 기반 스트림
: InputStream, OutputStream >> Stream이 붙어있음
: 데이터를 바이트 단위로 주고 받음
2) 보조 스트림
: 스트림의 기능을 향상시키거나 새로운 기능을 추가하기 위해 사용
: 독립적으로 입출력 수행 불가 (바이트 기반 보조 스트림, 문자 기반 보조 스트림 존재)
3) 문자기반 스트림
: Reader, Writer
: 입출력 단위가 문자(char, 2 byte)인 스트림
: 문자 기반 스트림의 최고 조상
1.3 바이트 기반 스트림
1. InputStream과 OutputStream
: 바이트 기반의 입/출력 스트림의 최고 조상
[InputStream]
[OutputStream]
2. FileInputStream과 FileOutputStream
: 파일에 데이터를 입출력하는 바이트 기반 스트림
1.4 바이트 기반 보조 스트림
1. FilterInputStream과 FilterOutputStream
: 모든 바이트 기반 보조 스트림의 최고조상
: 보조 스트림은 자체적으로 입출력 수행 불가
protected FilterInputStream(InputStream in)
public FilterOutputStream(OutputStream out)
: 상속을 통해 FilterInputStream/FilterOutputStream의 read()와 write()를 원하는 기능대로 오버라이딩 해야 함
public class FilterInputStream extends InputStream{
protected volatile InputStream in;
protected FilterInputStream(InputStream in){
this.in = in;
}
public int read() throws IOException{
return in.read();
}
...
}
FilterInputStream의 자손 - BufferedInputStream, DataInputStream, PushbackInputStream 등
FilterOutputStream의 자손 - BufferedOutputStream, DataOutputStream, PrintStream 등
2. BufferedInputStream과 BufferedOutputStream
: 입출력 효율을 높이기 위해 버퍼(byte[])를 사용하는 보조 스트림
: 보조 스트림을 닫으면 기반 스트림도 닫힘
3. DataInputStream과 DataOutputStream
: 기본형 단위로 읽고 쓰는 보조 스트림
: 각 자료형의 크기가 달라 입/출력 순서 주의 필요
4. SequenceInputStream
: 여러 입력스트림을 연결해 하나의 스트림처럼 다룰 수 있음
5. PrintStream
: 데이터를 다양한 형식의 문자로 출력하는 기능을 제공하는 보조 스트림
: PrintStream보다 PrintWiter 사용을 권장
1.5 문자 기반 스트림
1. Reader와 Writer
: 문자 기반 입/출력 스트림의 최고 조상
2. FileReader, FileWriter
: 문자기반의 파일 입출력
: 텍스트 파일의 입출력에 사용
3. PipedReader, PipedWriter
: 프로세스(스레드)간의 통신에 사용
4. StringReader, StringWriter
: charArrayReader, CharArrayWriter처럼 메모리 입출력에 사용
: StringWriter에 출력되는 데이터는 내부의 StringBuffer에 저장
1.6 문자 기반 보조 스트림
1. BufferedReader, BufferedWriter
: 입출력 효율을 높이기 위해 버퍼(char[])를 사용하는 보조스트림
: 라인 단위의 입출력이 편리
String readLine() // 한 라인을 읽어옴
void newLine() // 라인 구분자를 출력
2. InputStreamReader, OutputStreamWriter
: 바이트 기반 스트림을 문자 기반 스트림처럼 쓸 수 있도록 해줌
: 인코딩을 변환해 입출력을 가능하도록 함