본문 바로가기

# 02/Java

[윤성우 열혈자바] 32-2. 필터 스트림의 이해와 활용

반응형

입출력 필터 스트림의 이해 1


필터 입력 스트림  입력 스트림에 연결되는 필터 스트림

필터 출력 스트림  출력 스트림에 연결되는 필터 스트림


아래의 코드는 파일로부터 4바이트의 데이터를 읽어 들인다

InputStream in = new FileInputStream("data.dat");

byte buf[] = new byte[4];   // 4바이트의 공간을 마련하여

in.read(buf);   // 4바이트를 읽어 들인다.


파일로부터 int 데이터 하나를 읽어 들이려면?

단계 1: 파일로부터 1바이트 데이터 4개를 읽어 들인다.

단계 2: 읽어 들인 1바이트 데이터 4개를 하나의 int 데이터로 조합한다.

필터 스트림의 역할








입출력 필터 스트림의 이해 2



InputStream in = new FileInputStream("data.dat");   // 입력 스트림 생성

DataInputStream fIn = new DataInputStream(in);   // 필터 스트림 생성  연결


기본 자료형 데이터의 입력을 위한 필터 스트림



필터 스트림을 닫으면 입/출력 스트림도 자동으로 닫힘!!




OutputStream out = new FileOutputStream("data.dat");   // 출력 스트림 생성

DataOutputStream fOut = new DataOutputStream(out);   // 필터 스트림 생성  연결


기본 자료형 데이터의 출력을 위한 필터 스트림








입출력 필터 스트림의 


class DataFilterOutputStream {

   public static void main(String[] args) {

      try(DataOutputStream out =

          new DataOutputStream(new FileOutputStream("data.dat"))) {

         out.writeInt(370); // int 데이터 저장

         out.writeDouble(3.14); // double 데이터 저장

      }

      catch(IOException e) {

         e.printStackTrace();

      }

   }

}


순서대로 넣고 꺼내야함!!


class DataFilterInputStream {

   public static void main(String[] args) {

      try(DataInputStream in =

          new DataInputStream(new FileInputStream("data.dat"))) {

         int num1 = in.readInt(); // int 데이터 꺼냄

         double num2 = in.readDouble(); // double 데이터 꺼냄     

         System.out.println(num1);

         System.out.println(num2);

      }

      catch(IOException e) { . . . }

   }

}


370

3.14








버퍼링 기능을 제공하는 필터 스트림


class BufferedStreamFileCopier {

   public static void main(String[] args) {

      Scanner sc = new Scanner(System.in);

      System.out.print("대상 파일: ");

      String src = sc.nextLine();

      System.out.print("사본 이름: ");

      String dst = sc.nextLine();

     

      try(BufferedInputStream in = new BufferedInputStream(new FileInputStream(src)) ;

          BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(dst))) {

         int data;

         while(true) {

            data = in.read();

            if(data == -1)

               break;

            out.write(data);

         }

      }

      catch(IOException e) {

         e.printStackTrace();

      }

   }

}


바이트 단위 복사가 진행되지만 

버퍼링 되므로 속도는 빠르다!

속도가 안정적임 - 고루고루 성능이 좋음!!




BufferedInputStream




BufferedOutputStream










버퍼링 기능에 대한 대책, flush 메소드의 호출


출력 스트림 대상의 flush 연산: 목적지로 버퍼에 있는 데이터를 전송시킨다. 

   public void flush() throws IOException    // java.io.OutputStream 메소드

 

입력 스트림을 대상으로는 flush 기능이 정의되어 있지 않음!

이유는? 불필요하니까!

필요하면 바로 읽으면 되니깐 굳이 flush 메소드를 정의할 필요가 없다!


컴퓨터가 다운될때 데이터가 날아가는 것을 방지하고자 중요한 정보입력시에 flush 해주면 버퍼에 있는 데이터를 즉시 전송시킨다!!








파일에 기본 자료형 데이터를 저장하고 싶은데,

버퍼링 기능도 추가하면 좋겠다!


class BufferedDataOutputStream {

   public static void main(String[] args) {

      try(DataOutputStream out =

             new DataOutputStream(

                new BufferedOutputStream(

                   new FileOutputStream("data.dat")))) {

         out.writeInt(370);

         out.writeDouble(3.14);

      }

      catch(IOException e) {

         e.printStackTrace();

      }

   }

}



370을 받을 수 있는 스트림은 DataOutputStream이기 때문에 먼저와야 됨!

BufferedOutputStream 역시 FileOutputStream과 같이 바이트 배열을 받음!








앞서 보인 예제에 대응하는 예제

class BufferedDataInputStream {

   public static void main(String[] args) {

      try(DataInputStream in =

         new DataInputStream(

            new BufferedInputStream(

               new FileInputStream("data.dat")))) {

         int num1 = in.readInt();

         double num2 = in.readDouble();

         

         System.out.println(num1);

         System.out.println(num2);

      }

      catch(IOException e) {

         e.printStackTrace();

      }

   }

}


끝에 있는거 닫으면 다 닫힘! 여기서는 DataInputStream 만 피치 못할 사정으로 닫으면 나머지도 다 닫힘!


370

3.14


반응형