바이트기반 보조스트림
FilterInputStream, FilterOutputStream
FilterInputStream과 FilterOutputStream은 InputStream/OutputStream의 자손이면서 모든 보조스트림의 조상이다.
보조스트림은 자체적으로 입출력을 수행할 수 없기 때문에 기반 스트림을 필요로한다.
protected(FilterInputStream(InputStream in)
public FilterOutputStream(OutputStream out)
FilterI/OStream의 모든 메서드는 기반스트림의 메서드를 그대로 호출하고 Filter보조스트림은 아무런 일을 하지않는다. FilterInputStream, FilterOutputStream은 상속을 통해 원하는 작업을 수행하도록 읽고쓰는 메서드를 오버라이딩 해야한다.
FilterInputStream의 자손 BufferedInputStream, DataInputStream, PushbackInputStream 등
FilterOutputStream의 자손 BufferedOutputStream, DataOutputStream, PrintStream 등
BufferedInputStream, BufferedOutputStream
버퍼 보조스트림은 입출력의 효율을 높이기 위해 사용된다. 버퍼를 이용해서 한번에 여러 바이트를 입출력하는것이 빨라지기 떄문이다.
BufferedInputStream(InputStream in, int size) : InputStream인스턴스와 버퍼 사이즈를 지정하여 버퍼 InputStream을 생성한다.
BufferedInputStream(InputStream in) : InputStream인스턴스만을 인자로 넣어주며 버퍼의 사이즈를 지정해주지 않는경우 8192byte크기의 버퍼를 갖게된다.
BufferedInputStream은 입력소스로부터 데이터를 buffer크기만큼 데이터를 읽어 내부 버퍼에 저장해놓는다. 프로그램에서는 외부가 아닌 내부 버퍼에 저장된 데이터를 읽어들이기 때문에 효율적인 데이터 처리가 가능하다.
내부 버퍼에 저장된 모든 데이터를 읽어들인 이후 read메서드가 호출되면 BufferedInputStream은 입력 소스로부터 다시 버퍼크기만큼의 데이터를 읽어다 버퍼에 저장해 놓는다.
BufferedOutputStream(OutputStream out, int size) : OutputStream인스턴스와 버퍼 사이즈를 인자로 던져 내부버퍼를 갖는 BufferedOutputStream 인스턴스를 생성한다.
BufferedOutputStream(OutputStream out) : OutputStream인스턴스를 인자로 주며 사이즈를 지정해주지 않을 경우 기본 버퍼사이즈는 8192byte크기가 된다.
flush() : 버퍼의 모든 내용을 출력하여 버퍼를 비운다.
close() : flush()를 호출해서 버퍼의 모든 내용을 출력하고 BufferedOutputStream인스턴스가 사용하던 모든 자원을 반환한다.
BufferedOutputStream 도 버퍼를 이용하여 출력작업을 하게 된다. write()메소드를 이용하여 BufferedOutputStream의 데이터를 내부 버퍼에 복사하고 버퍼로부터 출력한다. 버퍼의 모든내용을 출력한 후 write()호출 시 버퍼를 비우고 추가적인 데이터들을 내부 버퍼에 복사한다.
출력소스가 버퍼에 남아있는 채로 프로그램이 종료될 수 있기 때문에, BufferedOutputStream을 사용완료한 후에는 반드시 BufferedOutputStream의 close()메소드나 flush() 메소드를 호출해 버퍼의 모든내용이 출력되도록 해야한다.
버퍼의 사이즈가 5기때문에 처음 write호출시 1부터 5까지만 write되고 6,7,8,9는 버퍼에 존재한다.
버퍼를 비우기위해 bos.close()를 호출하여 버퍼에 존재하는 6,7,8,9가 출력되고 버퍼를 비운다.
DataInputStream, DataOutputStream
DataInputStream은 FilterInputStream의 자손이며 DataInput인터페이스를 구현한 클래스이다.
DataOutputStream은 FilterOutputStream의 자손이며 DataOutput인터페이스를 구현한 클래스이다.
DataStream을 사용하면 byte뿐만아니라 8가지 기본 자료형의 값들도 읽기,쓰기가 가능하다. DataStream을 이용하여 기본 자료형 값을 출력한경우 이값을 읽기위해서는 똑같이 DataStream의 기본자료형을 이용해야한다.
sample.dat파일을 HxD로 열었을 경우이다. 4바이트중 10의 16진수인 A가 출력되고 20.0f가 4바이트로 41A00000이 저장되어있다. 마지막으로 ture값인 1이 저장된것을 알 수 있다.
sample.dat파일을 각각 기본자료형으로 읽어 출력하는 프로그램이다.
DataOutputStream으로 저장한 데이터 기본자료형에 맞추어 read를 해주면 정상적으로 파일을 읽을 수 있다.
데이터를 변환없이 저장하고 읽을때 사용하면 편하다.
try내부에서 파일을 while(true)로 계속해서 읽는다. 파일의 끝에 도달하여 read를 하면 EOFException이 발생하여 sum을 출력하고 try-catch부분이 끝나는경우 finally의 close()가 실행되어 스트림을 모두 비워준다.
JDK1.7이후부터 try-with-resource문을 이용하여 close()를 호출하지 않아도 자동호출되도록 할 수 있다.
위처럼 try의 내부()에 자원을 적어주는것이 try-with-resources문이다. 위처럼 처리해줄경우 close()를 직접 호출하지않아도 ()내부의 자원이 자동으로 close()된다.
SequenceInputStream
입력스트림을 연속적으로 연결해서 하나의 스트림으로부터 데이터를 읽을 수 있는것
SequenceInputStream(Enumeration e) : 저장된 입력스트림을 하나의 스트림으료 연결한다.
SequenceInputStream(InputStream s1, InputStream s2) : 두개의 입력스트림을 하나로 연결한다.
위처럼 사용할 수 있다.
'Programming > JAVA' 카테고리의 다른 글
바이트 기반 스트림 (0) | 2021.09.10 |
---|---|
자바의 입출력 (0) | 2021.09.10 |
그룹화와 분할 - groupingBy(), partitioningBy() (0) | 2021.09.02 |
collect() (0) | 2021.09.02 |
스트림의 최종연산 (0) | 2021.09.01 |