JAVA

보조 스트림

Stater 2019. 10. 23. 09:00

보조 스트림

- 기능을 더 해주는 스트림

 

실제 읽고 쓰는 스트림이 아닌 보조적인 기능을 추가하는 스트림

FilterInputStream과 FilterOutputStream이 보조 스트림의 상위 클래스

 

생성자 설명
FilterInputStream 생성자의 매개변수로 InputStream을 받는다.
FilterOutputStream 생성자의 매개변수로 OutputStream을 받는다.

 

데코레이터 패턴(Decorator Pattern)

데코레이터 패턴

 

Buffered 스트림 : 내부에 8192 바이트의 배열을 가지고 있으며, 읽거나 쓸 때 속도가 빠르다.

 

DataInpuStream / DataOutputStream : 자료가 저장된 상태 그대로 자료형을 유지하며 읽거나 쓰는 기능을 제공하는 스트림

 

■ 파일 복사 시간비교

4.98MB 짜리 시도한 시간

 

 

버퍼스트림을 사용해서 한 경우의 시간 비교 화면

동일한 4.98MB 짜리 버퍼를 사용해서 한 시간 비교

 

 

★SourceCode

■보조스트림 여러개 사용

package decorator;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class FileCopy {

	public static void main(String[] args) throws IOException {
		
		long milliseconds = 0;
		try ( FileInputStream fis = new FileInputStream("a.zip");
				FileOutputStream fos = new FileOutputStream("copy.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);
				}
		
				Socket socket = new Socket();
				//보조스트림의 여러개가 계속 감싸면서 기능이 계속적으로 추가되는 형태 데코레이터 패턴
				//소켓에서 바이트 단위로 읽고
				//socket.getInputStream()
				//InputStreamReader으로 감싸줘서 문자 단위로 읽을 수 있게 된다.
				// 다시 위의 것을 BufferedReader 감싸면 읽을때  버퍼링 기능까지 사용 할 수 있다.
				BufferedReader isr =new BufferedReader( new InputStreamReader(socket.getInputStream()));
				isr.readLine();
				System.out.println("시간:"+milliseconds);

	}

}

 

■보조스트림 

package 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);
			dos.write(100);
			dos.writeChar('A');
			dos.writeUTF("안녕하세요.");
			
			System.out.println(dis.readByte());
			System.out.println(dis.read());
			System.out.println(dis.readChar());
			System.out.println(dis.readUTF());
		}catch(IOException e) {
			
		}
		

	}

}

 

반응형

'JAVA' 카테고리의 다른 글

입출력 클래스 및 데코레이터패턴  (0) 2019.10.25
직렬화(Serialization)  (0) 2019.10.24
Socket통신 HTTP 통신  (0) 2019.10.22
문자 단위 입출력 스트림  (0) 2019.10.20
바이트 단위 입출력 스트림  (0) 2019.10.19