Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

Super Coding Addict

Ch14. 자바 입출력 (5) 본문

JAVA 문법

Ch14. 자바 입출력 (5)

밍응애 2021. 2. 18. 23:47

< 보조 스트림 >

  • 실제 읽고 쓰는 기능은 없지만, 보조적 기능을 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