Gymterview
middle

Для чего используется PushbackInputStream?

PushbackInputStream — это обрабатывающий поток (обёртка над другим InputStream), который позволяет вернуть один или несколько прочитанных байтов обратно в поток через метод unread().

Аналогия из жизни: представьте, что вы читаете текст и вам нужно «подсмотреть» следующее слово, чтобы решить, как обрабатывать текущее. PushbackInputStream позволяет прочитать слово, оценить его и «положить обратно», если оно нужно для следующего этапа обработки.

Это бывает необходимо при парсинге данных, когда для принятия решения о типе следующей конструкции нужно прочитать один или несколько байт вперёд (look-ahead). Если прочитанные байты относятся к следующей конструкции, их можно вернуть в поток.

Ключевые методы

  • unread(int b) — возвращает один байт в поток.
  • unread(byte[] b) — возвращает массив байт в поток.
  • unread(byte[] b, int off, int len) — возвращает часть массива в поток.

Конструктор PushbackInputStream(InputStream in, int size) позволяет задать размер внутреннего буфера для возвращаемых байт. По умолчанию буфер равен одному байту.

Пример использования

Пример
try (PushbackInputStream pis = new PushbackInputStream(
        new FileInputStream("data.bin"), 2)) {
    int firstByte = pis.read();
    if (firstByte == 0xFF) {
        int secondByte = pis.read();
        if (secondByte != 0xFE) {
            pis.unread(secondByte); // вернуть, если это не BOM
        }
    }
}

На собеседовании: объясните назначение — look-ahead при парсинге. Упомяните метод unread() и то, что размер буфера для возврата настраивается через конструктор.