Java BufferedOutputStream: эффективная байтовая запись
Java BufferedOutputStream: эффективная байтовая запись
Класс BufferedOutputStream из пакета java.io оборачивает другой OutputStream для ускорения байтового вывода. Буферизация данных в памяти сокращает количество операций записи в базовое устройство, что значительно повышает производительность, особенно для больших файлов.
Он наследуется от абстрактного OutputStream и предоставляет конкретные реализации его методов.
Как работает BufferedOutputStream
Внутренне поток выделяет буфер 8 KiB (8192 байта) по умолчанию. При вызове write() байты сначала помещаются в этот буфер. Только когда буфер заполняется или вызывается flush() / close(), данные сбрасываются в базовый поток.
Так как дисковый I/O затратен, эта стратегия снижает количество обращений и делает байтовую запись заметно быстрее.
Создание BufferedOutputStream
Импортируйте класс и оберните любой OutputStream, обычно FileOutputStream:
FileOutputStream file = new FileOutputStream("output.txt");
BufferedOutputStream buffer = new BufferedOutputStream(file);
Для управления размером буфера передайте второй аргумент:
BufferedOutputStream buffer = new BufferedOutputStream(file, 16384); // 16 KiB буфер
Больший буфер может быть полезен для очень больших записей, но стандартные 8 KiB подходят для большинства сценариев.
Ключевые методы BufferedOutputStream
write()
write(int b)— добавляет один байт в буфер.write(byte[] b)— записывает весь байтовый массив.write(byte[] b, int off, int len)— записываетlenбайт начиная со смещенияoff.
Пример: запись текста в файл
import java.io.*;
public class Main {
public static void main(String[] args) {
String data = "This is a line of text inside the file";
try (FileOutputStream fos = new FileOutputStream("output.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos)) {
bos.write(data.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
}
}
Программа создаёт output.txt со содержимым:
This is a line of text inside the file
Примечание: String.getBytes() преобразует строку в байтовый массив с использованием кодировки платформы по умолчанию. Для детерминированных результатов укажите кодировку, например data.getBytes(StandardCharsets.UTF_8).
flush()
Принудительно сбрасывает буферизованные данные в базовый поток немедленно. Полезно для обеспечения сохранности данных перед закрытием или при записи в сетевой сокет.
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write(data.getBytes());
bos.flush(); // гарантирует отправку данных
close()
Закрывает поток, сбрасывая оставшиеся данные и освобождая системные ресурсы. После close() поток нельзя использовать снова.
Полный справочник: BufferedOutputStream API.
java
- Ключевое слово final в Java: переменные, методы и классы
- Оператор instanceof в Java: полное руководство с примерами
- Наследование в Java: концепции, типы и практические примеры
- Статические вложенные классы в Java: использование, отличия и примеры
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Рефлексия в Java: инспекция классов, методов и полей во время выполнения
- Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
- Освоение Java Generics: создание переиспользуемого, типобезопасного кода
- Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление