필터 스트림

기본 입출력 스트림들만으로는 기능이 부족한 경우가 있다. 이런 경우에는 자신이 원하는 입출력 기능을 사용하기 위하여 기존의 스트림에 필터를 적용하게 된다. (2 스트림이라고도 부른다.)

 

필터 스트림(2 스트림) 기본 스트림의 기능을 확장시키거나 사용하기 쉽게 변환해주는 스트림으로써 JDK에서 기본으로 제공되어지는   많은 클래스들이 존재한다.

 

필터 스트림 클래스는 다른 클래스를 감싸서 보다 상위에 놓이기 하므로서 추가적인 기능을 거치도록 하는 역할을 한다.(Delegate call)

 

 InputStream bufferedIn = new BufferedInputStream( System.in );

 

생성자에서 Target 스트림을 받게되는데, 이것은 추가 처리후에 요청을 위임(delegate)한다.

 

위의 코드에서BufferedInputStream FilterInputStream필터클래스의 subclass인데 필터클래스는  System.inBufferedInputStream필터 클래스로 감싸도록 하므로서 버퍼링처리가 가능한 read기능을 추가로 제공하고 있다.

 

이러한 필터 클래스는 원하는 경우 새로운 동작을 하는 필터 클래스를 만들수 있다.

다음은 파일로 부터 읽어 들인  내용을  소문자로 변환 출력하는 필터 클래스와 테스트 코드이다.

 

public class LowerCaseInputStream extends FilterInputStream {

 

       /**

        * @param in

        */

       protected LowerCaseInputStream(InputStream in) {

              super(in);

       }

 

       @Override

       public int read() throws IOException {

              int c = super.read();

              return (c == -1 ? c : Character.toLowerCase((char) c));

       }

 

       @Override

       public int read(byte[] b, int off, int len) throws IOException {

              int result = super.read(b, off, len);

              for (int i = off; i < off + result; i++) {

                     b[i] = (byte) Character.toLowerCase((char) b[i]);

              }

              return result;

       }

 

}

 

 

테스트코드

public class InputTest {

 

       /**

        * @param args

        */

       public static void main(String[] args) {

              int c;

 

              try {

                     InputStream in =

                           new LowerCaseInputStream(

                                  new BufferedInputStream(

                                         new FileInputStream("test.txt")));

 

                     while((c = in.read()) >= 0) {

                           System.out.print((char)c);

                     }

 

                     in.close();

              } catch (IOException e) {

                     e.printStackTrace();

              }

       }

}

 

 

이러한 프로그래밍 패턴은 데코레이션 패턴과 일맥 상통하는데, 기존의 기능에 추가적인 요건을   입게 하므로서 클래스간의 유연성을 유지시키기 때문이다. 실제로 IO클래스는 Decorator패턴으로 구현된 대표적인 사례라 할수 있겠다. , FilterInputStream, FilterOutputStream, FilterReader, FilterWriter 데코레이터 패턴을 위한 Decorator 클래스라고 있다.


JDK에서 제공되는 기본 필터클래스


FilterInputStream

BufferedInputStream, CheckedInputStream, CipherInputStream, DataInputStream, DeflaterInputStream, DigestInputStream, InflaterInputStream, LineNumberInputStream, ProgressMonitorInputStream, PushbackInputStream


FilterOutputStream

BufferedOutputStream, CheckedOutputStream, CipherOutputStream, DataOutputStream, DeflaterOutputStream, DigestOutputStream, InflaterOutputStream, PrintStream


FilterReader

PushbackReader


FilterWriter

 -

 

Posted by Steven J.S Min
,