Super Coding Addict
Ch14. 자바 입출력 (5) 본문
< 보조 스트림 >
- 실제 읽고 쓰는 기능은 없지만, 보조적 기능을 add-on [Decorator]
* 보조 스트림
- FilterInputStream과 FilterOutputStream이 최상위 클래스
- 생성자의 매개변수로 또 다른 스트림을 가짐
- 데코레이터 패턴
* 여러가지 보조 스트림 사용하기
- Buffered스트림 : 내부에 8192 바이트 (약 8K) 배열을 가지고 있으며, 읽거나 쓸 때 속도가 빠르다 (8K정도만큼 한꺼번에 읽고 쓰고 하기 때문에)
- DataInputStream / DataOutputStream : 데이터의 자료를 그대로 저장하고 읽을 수 있는 스트림
- 예제
# FileCopy 클래스
--> FileInputStream과 FileOutputStream을 이용해 zip파일을 copy해보자.
package Ch14.stream.decorator;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
public static void main(String[] args) {
long milliseconds = 0;
try(FileInputStream fis = new FileInputStream("memo_t-20201002T144523Z-001.zip");
FileOutputStream fos = new FileOutputStream("copy.zip")){
milliseconds = System.currentTimeMillis();
int i;
while( (i = fis.read()) != -1) {
fos.write(i);
}
milliseconds = System.currentTimeMillis() - milliseconds;
}catch(IOException e){
System.out.println(e);
}
System.out.println("걸린 시간 : " + milliseconds);
}
}
--> 약 80초정도 걸림
--> 보조스트림인 BufferedInputStream과 BufferedOutputStream을 이용해보자
package Ch14.stream.decorator;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
public static void main(String[] args) {
long milliseconds = 0;
try(FileInputStream fis = new FileInputStream("memo_t-20201002T144523Z-001.zip");
FileOutputStream fos = new FileOutputStream("copy1.zip");
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos)){
milliseconds = System.currentTimeMillis();
int i;
while( (i = bis.read()) != -1) {
bos.write(i);
}
milliseconds = System.currentTimeMillis() - milliseconds;
}catch(IOException e){
System.out.println(e);
}
System.out.println("걸린 시간 : " + milliseconds);
}
}
--> Buffered~ 스트림으로 File~스트림을 감싸주면, 훨씬 빠른 속도로 copy를 해낸다.
--> 약 0.9초가 소요되었다!!
--> 한편, 보조스트림은 다른 보조스트림을 감쌀 수도 있다!
--> socket은 바이트 단위로 읽어올 수 있으므로, getInputStream으로 데이터를 읽은 후, 보조스트림인 InputStreamReader로 감싸 한글도 읽을 수 있게 하고, 이것을 보조스트림인 BufferedReader로 감싸 속도를 빠르게 한다
- 예제
# DataStreamTest 클래스
package Ch14.stream.decorator;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class DataStreamTest {
public static void main(String[] args) {
try(FileOutputStream fos = new FileOutputStream("data.txt");
DataOutputStream dos = new DataOutputStream(fos);
FileInputStream fis = new FileInputStream("data.txt");
DataInputStream dis = new DataInputStream(fis)){
dos.writeByte(100); //1바이트로 쓰임
dos.write(100); //4바이트로 쓰임
dos.writeChar('A');
dos.writeUTF("안녕하세요");
//write와 매핑되는 API로 읽어야함
System.out.println(dis.readByte());
System.out.println(dis.read());
System.out.println(dis.readChar());
System.out.println(dis.readUTF());
}catch(IOException e){
}
}
}
--> DateOutputStream으로 쓰고, DataInputStream으로 읽을 때는 매핑되는 API로 메서드를 써야한다!
가령 writeByte()메서드로 썼으면 read()가 아니라 readByte()로 읽어주어야 함!!
'JAVA 문법' 카테고리의 다른 글
Ch14. 자바 입출력(7) (0) | 2021.02.21 |
---|---|
Ch14. 자바 입출력(6) (0) | 2021.02.20 |
Ch14. 자바 입출력 (4) (0) | 2021.02.18 |
Ch14. 자바 입출력 (3) (0) | 2021.02.18 |
Ch14. 자바 입출력 (2) (0) | 2021.02.16 |