2009-11-11 51 views
2

爲什麼使用過濾器流和在哪裏?我讀過濾流將用於讓所需的信息進入流..是否正確,如果是的話,我們如何從流中過濾,以及它將在哪裏使用?什麼是真正的過濾器流?

java.io.Filter ....

我在這裏的問題是,它很難理解爲什麼我們使用的過濾器流,因爲我們可以用其他流做大部分的東西,對吧。

+3

這是什麼,「過濾器」,你會說什麼? 'javax.servlet.Filter'?請指出您正在討論的API,並且請告知更多關於您的問題/問題的上下文。這太模糊了。 – BalusC 2009-11-11 12:51:34

回答

9

我想你是在談論java.io.Filter *(如FilterInputStream)。

如果我們談論FilterInputStream類,它僅僅是一個無用的InputStream的包裝。對Filter的方法的每次調用都將簡單地調用封裝的InputStream上的對應方法。一個人,它是無用的。

想象一下,您需要一個將每個「a」字符轉換爲「b」的InputStream。你可以擴展FilterInputStream中和覆蓋閱讀()方法:

// this code has not been tested 
class ABFilter extends FilterInputStream { 
    public ABFilter (InputStream in) { 
     super(in); 
    } 
    @Override 
    public int read() { 
     int character = super.read(); 
     if (character == 97) 
      return 98; 
     return character; 
    } 
    // similarly implement all other "read()" methods 
} 

現在你可以使用這個流包裝任何現有的流:

InputStream streamWithA = ...; 
InputStream streamWithoutA = new ABFilter(streamWithA); 
+0

能否請您詳細說明..謝謝 – i2ijeya 2009-11-11 13:07:22

+0

謝謝...瞭解如何過濾完成..那麼子類是做什麼的。即,它有四個派生類,這些類是FilterInputStream的子類的目的是什麼? – i2ijeya 2009-11-11 13:20:12

+0

由於FilterInputStream沒有任何0參數構造函數,我們怎麼能擴展它與另一個類? – i2ijeya 2009-11-11 14:49:55

3

需要這些過濾器*類可以擴展類在運行時不知道底層類型。這種模式被稱爲裝飾或包裝,

http://en.wikipedia.org/wiki/Decorator_pattern

採取的BufferedInputStream爲例。沒有包裝,你需要爲每個InputStream使用多個版本。例如,

BufferedInputStream extends InputStream ... 
    BufferedFileInputStream extends FileInputStream ... 
    BufferedByteArrayInputStream extends ByteArrayInputStream ... 
與包裝物

現在,所有你需要的是

BufferedInputStream extends FilterInputStream ...