보조 스트림
- 실제로 읽고 쓰는 스트림이 아닌 보조 기능을 제공하는 스트림
- FilterInputStream과 FilterOutputStream이 보조 스트림의 상위 클래스들
- 셍성자의 매개변수로 또 다른 스트림(기반 스트림이나 다른 보조 스트림)을 가짐
- 기능을 확장하기 위해 상속을 이용하면 hierarchy 복잡해질 수 있음 → Decorator Pattern으로 구현
InputStreamReader와 OutputStreamWriter
InputStreamReaderTest.java
- FileInputStream은 바이트 단위로 파일을 읽는 스트림
- 이를 InputStreamReader로 감싸주어 바이트로 읽은 자료를 문자로 변환해줌
package ch16;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
public class InputStreamReaderTest {
public static void main(String[] args) {
// 보조스트림의 매개변수로 FileInputStream 입력
try(InputStreamReader isr = new InputStreamReader(new FileInputStream("reader.txt"))) {
int i;
while((i = isr.read()) != -1) {
System.out.print((char)i);
}
} catch(IOException e) {
}
}
}
BufferedInputStream과 BufferedOutputStream
FileCopyTest.java
- a.zip 파일을 읽어 복사하여 출력하기
- FileInputStream과 FileOutputStream만을 이용했을 때 (소요시간 약 4~5초)
package ch16;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopyTest {
public static void main(String[] args) {
long millisecond = 0;
try(FileInputStream fis = new FileInputStream("a.zip"); FileOutputStream fos = new FileOutputStream("copy.zip")) {
millisecond = System.currentTimeMillis();
int i;
while((i = fis.read()) != -1) {
fos.write(i);
}
millisecond = System.currentTimeMillis() - millisecond; // 복사 소요 시간
} catch (IOException e){
e.printStackTrace();
}
System.out.println(millisecond);
}
}
- BufferedInputStream과 BufferedOutputStream을 이용하면 입출력 소요 시간이 줄어듦 (약 0.02초)
try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream("a.zip"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("copy.zip")))
- 여러 개의 보조 스트림이 있는 예시
- 마지막 매개 변수로 들어간 스트림이 기반 스트림
Socket socket = new Socket();
// socket.getInputStream().read(); 바이트 단위로만 읽음
InputStreamReader isr = new InputStreamReader(socket.getInputStream().read()); // 바이트를 읽어들여 문자로 변환
BufferedReader br = new BufferedReader(isr); // 더 빠르게 입출력 가능
br.readLine(); // BufferedReader에만 있는 메서드, 한줄씩 읽음
}
DataInputStream과 DataOutputStream
- 자료가 메모리에 저장된 상태 그대로 읽거나 쓰는 스트림
DataStreamTest.java
- write로 출력한 데이터 타입 순서대로 read 해야 함
- 데이터 타입을 다르게 읽어들이면 전혀 다른 값이 읽힘
public class DataStreamTest {
public static void main(String[] args) {
try(FileOutputStream fos = new FileOutputStream("data.txt");
DataOutputStream dos = new DataOutputStream(fos))
{
dos.writeByte(100);
dos.writeChar('A');
dos.writeInt(10);
dos.writeFloat(3.14f);
dos.writeUTF("Test");
}catch(IOException e) {
e.printStackTrace();
}
try(FileInputStream fis = new FileInputStream("data.txt");
DataInputStream dis = new DataInputStream(fis))
{
System.out.println(dis.readByte());
System.out.println(dis.readChar());
System.out.println(dis.readInt());
System.out.println(dis.readFloat());
System.out.println(dis.readUTF());
}catch (IOException e) {
e.printStackTrace();
}
}
}
'Java & Kotlin' 카테고리의 다른 글
[Java 기능] 직렬화 (0) | 2022.02.17 |
---|---|
[Java 기능] 문자 단위 입출력 스트림 (0) | 2022.02.17 |
[Java 기능] 바이트 단위 입출력 스트림 (0) | 2022.02.17 |