Ответ
InputStream — это абстрактный класс, представляющий поток ввода байтов. Его цель — предоставить унифицированный интерфейс для чтения байтовых данных из самых разных источников, абстрагируясь от их конкретной природы.
Основная идея: Неважно, читаете вы из файла, сетевого сокета, массива байтов в памяти или строки — вы работаете с одним и тем же типом InputStream.
Источники данных и конкретные реализации:
FileInputStream– чтение из файла.ByteArrayInputStream– чтение из массива байтов (byte[]).Socket.getInputStream()– чтение из сетевого соединения.System.in– стандартный ввод (такжеInputStream).
Базовые методы:
// Читает один байт и возвращает его как int (0-255), или -1 в конце потока
int read();
// Читает байты в массив buffer, возвращает количество реально прочитанных байтов
int read(byte[] buffer);
// Закрывает поток и освобождает ресурсы (ВАЖНО!)
void close();
Пример чтения файла с буферизацией (использование декоратора):
// try-with-resources гарантирует вызов close()
try (InputStream raw = new FileInputStream("data.bin");
InputStream buffered = new BufferedInputStream(raw)) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = buffered.read(buffer)) != -1) {
// Обработка прочитанных байтов (от 0 до bytesRead)
processBytes(buffer, bytesRead);
}
} catch (IOException e) {
e.printStackTrace();
}
Почему именно байты? InputStream работает на низком уровне. Для чтения текста (символов) используются декораторы-адаптеры Reader (например, InputStreamReader), которые преобразуют байты в символы с учётом кодировки.
Ключевой принцип: InputStream организует работу по паттерну «Декоратор», позволяя наращивать функциональность (буферизация, распаковка, фильтрация) путём обёртывания одного потока в другой.