2009-11-11 4 views
2

Pourquoi le flux de filtres est-il utilisé et où? J'ai lu que les flux de filtre seront utilisés pour laisser les informations nécessaires dans le flux .. Est-ce exact et si oui, comment nous pouvons filtrer à partir du flux et où exactement il sera utilisé ??Qu'est-ce que le filtre Filter fait vraiment?

java.io.Filter ....

Mon problème ici est il est très difficile de comprendre pourquoi nous utilisons les flux de filtrage, puisque nous pouvons le faire la plupart des étoffes en utilisant d'autres cours d'eau, à droite.

+3

Qu'est-ce « filtre », où vous parlez? 'javax.servlet.Filter'? Veuillez indiquer l'API dont vous parlez et en dire plus sur le contexte de votre problème/question. C'est trop ambigu. – BalusC

Répondre

9

Je suppose que vous parlez de java.io.Filter * (comme FilterInputStream). Si nous parlons de la classe FilterInputStream, il s'agit simplement d'un wrapper autour d'un InputStream qui ne fait rien. Chaque appel à une méthode du filtre appellera simplement la méthode correspondante sur le InputStream enveloppé. Seul, c'est tout à fait inutile. Imaginez que vous vouliez un InputStream qui transforme chaque "a" en "b". Vous pouvez étendre FilterInputStream et passer outre la lecture() méthodes:

// 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 
} 

Maintenant, vous pouvez utiliser ce flux pour envelopper tout flux existant:

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

Pourriez-vous s'il vous plaît être en détail .. merci – i2ijeya

+0

Merci ... compris comment le filtrage est fait .. Alors, que font les sous-classes. c'est-à-dire, il a quatre classes dérivées et quel est le but de ces classes étant la sous-classe de FilterInputStream ?? – i2ijeya

+0

Puisque FilterInputStream n'a pas de constructeur 0 argument, comment pourrions-nous l'étendre avec un autre classe ??? – i2ijeya

3

Ces classes Filter * sont nécessaires pour pouvoir étendre les classes à l'exécution sans connaître le type sous-jacent. Ce modèle est appelé décorateur ou Wrapper,

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

Prenez BufferedInputStream comme exemple. Sans wrapper, vous auriez besoin de plusieurs versions pour chaque InputStream. Par exemple,

BufferedInputStream extends InputStream ... 
    BufferedFileInputStream extends FileInputStream ... 
    BufferedByteArrayInputStream extends ByteArrayInputStream ... 

Maintenant, avec l'emballage, tout ce que vous avez besoin est

BufferedInputStream extends FilterInputStream ...