Kosta 교육

[Day15 - JAVA] chap14. 입출력

희희웃는청바지 2023. 9. 1. 09:53

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

: 바이트 기반 스트림을 문자 기반 스트림처럼 쓸 수 있도록 해줌

: 인코딩을 변환해 입출력을 가능하도록 함