Что общего у классов FileInputStream и ByteArrayInputStream в Java?

«Что общего у классов FileInputStream и ByteArrayInputStream в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оба класса, FileInputStream и ByteArrayInputStream, являются конкретными реализациями абстрактного класса java.io.InputStream.

Общие характеристики:

  • Наследуют один и тот же контракт для чтения байтовых данных.
  • Предоставляют стандартные методы read(), read(byte[] b), read(byte[] b, int off, int len), available() и close().
  • Используют паттерн декоратор и могут быть обёрнуты в другие потоки (например, BufferedInputStream).

Различие заключается только в источнике данных: FileInputStream читает из файла в файловой системе, а ByteArrayInputStream — из байтового массива (byte[]) в памяти.

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

// Чтение из файла
try (InputStream fis = new FileInputStream("data.txt")) {
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = fis.read(buffer)) != -1) {
        // обработка данных в buffer
    }
}

// Чтение из массива байтов в памяти
byte[] data = "Hello".getBytes(StandardCharsets.UTF_8);
try (InputStream bais = new ByteArrayInputStream(data)) {
    int byteData;
    while ((byteData = bais.read()) != -1) {
        System.out.print((char) byteData);
    }
}