Java: FilterInputStream, какие преимущества и преимущества по сравнению с другими потоками - программирование
Подтвердить что ты не робот

Java: FilterInputStream, какие преимущества и преимущества по сравнению с другими потоками

Я читал в InputStream, FileInputStream, ByteArrayInputStream и как их использование кажется совершенно ясным (выходные потоки тоже).

То, что я пытаюсь понять, заключается в использовании FilterInputStream и FilterOutputStream:

  • В чем преимущество использования его по сравнению с другими классами потоков?
  • Когда следует использовать его?
  • Просьба представить теоретическое объяснение и базовый пример.
4b9b3361

Ответ 1

FilterInputStream является примером шаблона Decorator.

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

Например, BufferedInputStream обеспечивает буферизацию базового входного потока для ускорения чтения данных и DigestInputStream вычисляет криптографический хэш данных по мере его потребления.

Вы использовали бы это, чтобы добавить функциональность к существующему коду, который зависит от API InputStream или OutputStream. Например, предположим, что вы используете некоторую библиотеку, которая сохраняет данные в OutputStream. Данные становятся слишком большими, поэтому вы хотите добавить сжатие. Вместо изменения библиотеки сохранения данных вы можете изменить свое приложение так, чтобы оно "украшало" поток, который он создает в настоящее время, с ZipOutputStream. Библиотека будет использовать поток так же, как использовала старую версию, которой не хватало сжатие.

Ответ 2

Вы используете их, когда хотите украсить поток данных.

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

Например, вы можете удалить все несколько пробелов из некоторого потока. Вы создаете свой собственный подкласс FilterInputStream и переопределяете метод read(). Я не буду беспокоить все детали, но здесь некоторые sorta-java для метода в подклассе:

private boolean lastWasBlank = false;
public int read() {
    int chr = super.read();
    if (chr == ' ') {
        if (lastWasBlank) {
            return read();
        } else {
            lastWasBlank = true;
        }
    } else {
        lastWasBlank = false;
    }
    return chr;
}

В реальной жизни вы, вероятно, столкнетесь с другими двумя методами read().

Другие использования:

  • Записывать все, проходящие через поток
  • Дублируйте утилиту "tee", так что прочитанный поток обрабатывается двумя способами.
  • Преобразование окончаний строк между форматами Windows, Mac и Unix/Linux.
  • Добавьте задержки для имитации медленных методов передачи, таких как модемы или последовательные порты или беспроводные сетевые подключения.