코딩하는 털보

OOP - 70 본문

IT Study/JAVA OOP

OOP - 70

이정인 2020. 12. 24. 11:26

객체 지향 프로그래밍

70. 보조 스트림

실제 읽고 쓰는 스트림이 아닌 보조적인 기능을 추가하는 스트림
데코레이터라고도 불린다
상위 클래스 FilterInputStream, FilterOutputStream
생성자의 매개변수로 다른 스트림을 가진다

데코레이터 패턴(Decorator Pattern)
기반 스트림 > 보조 스트림1 > 보조 스트림2

Buffered 스트림 : 내부에 8192바이트 배열을 가지고 있음, 읽거나 쓸때 속도가 빠름

private static int DEFAULT_BUFFER_SIZE = 8192;

Buffered 스트림을 이용하여 파일 복사

package stream.decorator;

import java.io.*;
//import java.net.Socket;
//import java.nio.Buffer;

public class FileCopy {
    public static void main(String[] args) throws IOException {

        long milliseconds = 0;

        try(FileInputStream fis = new FileInputStream("IdeaProjects/Chapter14/alpha.txt");
            FileOutputStream fos = new FileOutputStream("IdeaProjects/Chapter14/copy.txt");
            BufferedInputStream bis = new BufferedInputStream(fis); //더 빠르게 처리하기 위해 데코레이터 사용
            BufferedOutputStream bos = new BufferedOutputStream(fos)) {

            milliseconds = System.currentTimeMillis(); //현재시간

            int i;
            while ((i=bis.read()) != -1) {
                bos.write(i); //while 동안 한 바이트씩 읽어서 바로 쓰기
            }

            milliseconds = System.currentTimeMillis() - milliseconds; //시간차 계산
        } catch (IOException e) {
            System.out.println(e);
        }
        System.out.println(milliseconds);

        //Socket socket = new Socket();

        //BufferedReader isr = new BufferedReader(new InputStreamReader(socket.getInputStream())); //byte->문자 보조에 추가로 버퍼기능까지
        //isr.readLine();//BufferedReader에만 있는 메서드, 한줄만 읽는 기능(/n 까지)

    }
}

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

package stream.decorator;

import java.io.*;

public class DataStreamTest {
    public static void main(String[] args) {

        try(FileOutputStream fos = new FileOutputStream("IdeaProjects/Chapter14/data.txt");
            DataOutputStream dos = new DataOutputStream(fos);
            FileInputStream fis = new FileInputStream("IdeaProjects/Chapter14/data.txt");
            DataInputStream dis = new DataInputStream(fis)) {

            dos.writeByte(100); //한 바이트로 씀
            dos.write(100); //4 바이트로 씀
            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) {
            System.out.println(e);
        }
    }
}
Comments