Что на самом деле делает поток фильтра? - PullRequest
2 голосов
/ 11 ноября 2009

Почему используется поток фильтра и где? Я читал, что потоки фильтров будут использоваться для ввода необходимой информации в поток. Это правильно, и если да, то как мы можем фильтровать из потока и где именно она будет использоваться ??

java.io.Filter ....

Моя проблема заключается в том, что очень трудно понять, почему мы используем потоки фильтров, так как мы можем делать большинство вещей, используя другие потоки, верно.

Ответы [ 2 ]

9 голосов
/ 11 ноября 2009

Полагаю, вы говорите о java.io.Filter * (например, FilterInputStream).

Если мы говорим о классе FilterInputStream, то это просто оболочка для InputStream, которая ничего не делает. Каждый вызов метода Filter будет просто вызывать соответствующий метод в упакованном InputStream. В одиночку это совершенно бесполезно.

Представьте, что вам нужен InputStream, который преобразует каждый символ "a" в "b". Вы можете расширить FilterInputStream и переопределить методы read ():

// 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);
3 голосов
/ 11 ноября 2009

Эти классы Filter * необходимы, чтобы иметь возможность расширять классы во время выполнения, не зная базового типа. Этот шаблон называется Decorator или Wrapper,

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

Взять BufferedInputStream в качестве примера. Без обертки вам потребуется несколько версий для каждого InputStream. Например,

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

Теперь с упаковщиком, все, что вам нужно, это

  BufferedInputStream extends FilterInputStream ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...