Освоение Java BufferedInputStream: эффективное байтовое чтение и продвинутые методы
Обзор класса Java BufferedInputStream
Класс BufferedInputStream в пакете java.io улучшает байтовые входные потоки, добавляя внутренний буфер для более быстрого и эффективного чтения данных.
Он расширяет абстрактный класс InputStream.
Как работает BufferedInputStream
BufferedInputStream поддерживает внутренний буфер размером 8192 байта по умолчанию. При запросе операции чтения блок байтов извлекается из базового потока (обычно файла) и сохраняется в этом буфере. Последующие вызовы чтения потребляют байты из буфера до его истощения, после чего загружается следующий блок. Это снижает затратные дисковые I/O и ускоряет потребление данных.
Создание BufferedInputStream
Импортируйте класс:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
Затем инстанцируйте, оборачивая низкоуровневый поток, например FileInputStream:
FileInputStream file = new FileInputStream("example.txt");
BufferedInputStream buffer = new BufferedInputStream(file);
Можно задать пользовательский размер буфера:
int bufferSize = 16_384; // 16 KB
BufferedInputStream buffer = new BufferedInputStream(file, bufferSize);
Чем больше буфер, тем меньше обращений к диску — полезно для больших файлов или сетевых потоков.
Ключевые методы BufferedInputStream
read()
int read()— читает один байт, возвращает как целое (0–255) или-1при конце потока.int read(byte[] b)— читает доb.lengthбайт в массив.int read(byte[] b, int off, int len)— читает доlenбайт вbначиная со смещенияoff.
Пример: побайтовое чтение текстового файла и вывод в консоль.
import java.io.BufferedInputStream;
import java.io.FileInputStream;
public class Main {
public static void main(String[] args) {
try (BufferedInputStream in = new BufferedInputStream(new FileInputStream("input.txt"))) {
int byteRead;
while ((byteRead = in.read()) != -1) {
System.out.print((char) byteRead);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Вывод:
This is a line of text inside the file.
available()
Метод available() сообщает количество байтов, которые можно прочитать без блокировки. Помогает оценить прогресс при обработке больших потоков.
FileInputStream file = new FileInputStream("input.txt");
BufferedInputStream buffer = new BufferedInputStream(file);
System.out.println("Доступно байтов: " + buffer.available());
// ... чтение данных
System.out.println("Осталось байтов: " + buffer.available());
buffer.close();
skip(long n)
Используйте skip() для пропуска указанного числа байт. Возвращает фактическое количество пропущенных байт, которое может быть меньше запрошенного при достижении конца потока.
buffer.skip(5); // пропуск первых 5 байт
close()
Всегда закрывайте поток (желательно через try-with-resources) для освобождения системных ресурсов. После закрытия поток нельзя повторно использовать.
Другие заметные методы
| Метод | Описание |
|---|---|
mark(int readLimit) | Помечает текущую позицию в потоке. Последующие вызовы reset() вернут к этой точке, если прочитано не более readLimit байт. |
reset() | Перемещает поток к последней отмеченной позиции. |
Полный справочник: официальная документация Java.
java
- Ключевое слово final в Java: переменные, методы и классы
- Оператор instanceof в Java: полное руководство с примерами
- Статические вложенные классы в Java: использование, отличия и примеры
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Рефлексия в Java: инспекция классов, методов и полей во время выполнения
- Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
- Освоение Java BufferedReader: эффективная обработка символьных потоков
- Освоение Java Generics: создание переиспользуемого, типобезопасного кода
- Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление