Буферизовані потоки BufferedInputStream та BufferedOutputStream
Буферизовані потоки в Java, такі як BufferedInputStream і BufferedOutputStream, забезпечують більш ефективне введення та виведення даних. Вони використовують внутрішні буфери для зменшення кількості операцій із диском або іншими джерелами введення-виведення, що покращує продуктивність при роботі з великими обсягами даних.
1. BufferedInputStream
BufferedInputStream додає можливість буферизації до існуючого потоку введення, що означає, що дані читаються спочатку у внутрішній буфер, а потім по мірі потреби передаються програмі. Це зменшує кількість операцій з джерелом даних, таких як файл або мережа, тим самим прискорюючи процес.
Основні методи:
- read() — читає один байт з потоку.
- read(byte[] b, int off, int len) — читає до len байтів у масив b, починаючи з позиції off.
- mark(int readlimit) — позначає поточну позицію в потоці.
- reset() — повертається до попередньої позиції, встановленої методом mark().
- close() — закриває потік і звільняє ресурси.
Приклад використання BufferedInputStream:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(“input.txt”))) {
int byteData;
while ((byteData = bis.read()) != -1) {
System.out.print((char) byteData); // Виводимо символи
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. BufferedOutputStream
BufferedOutputStream забезпечує буферизацію даних для потоку виведення. Це означає, що дані спочатку накопичуються у внутрішньому буфері, а потім записуються в цільовий потік (наприклад, у файл) блоками, що значно зменшує кількість операцій запису та підвищує продуктивність.
Основні методи:
- write(int b) — записує один байт у буфер.
- write(byte[] b, int off, int len) — записує масив байтів, починаючи з позиції off і до len байтів.
- flush() — записує всі накопичені в буфері дані у вихідний потік.
- close() — закриває потік, перед цим викликаючи flush() для запису залишкових даних з буфера.
Приклад використання BufferedOutputStream:
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(“output.txt”))) {
String message = “Hello, BufferedOutputStream!”;
bos.write(message.getBytes());
bos.flush(); // Забезпечує запис усіх даних з буфера
} catch (IOException e) {
e.printStackTrace();
}
}
}
Переваги буферизованих потоків:
- Покращена продуктивність: Буферизація зменшує кількість викликів до фізичних пристроїв введення-виведення (таких як диск або мережа), що значно прискорює роботу з великими обсягами даних.
- Зменшення кількості операцій з диском: Замість того, щоб записувати або читати дані по одному байту, буферизовані потоки працюють із блоками даних.
- Зручність використання: Вони легко інтегруються з іншими потоками, такими як FileInputStream та FileOutputStream.
Як працює буферизація:
- Читання: Коли ви читаєте з буферизованого потоку, спочатку зчитується цілий блок даних у буфер, а потім окремі байти передаються програмі з цього буфера. Якщо буфер закінчився, завантажується новий блок даних.
- Запис: Дані спочатку записуються в буфер. Як тільки буфер заповнений або явно викликаний метод flush(), усі дані записуються в цільовий потік (наприклад, файл).
Коли використовувати:
- Коли необхідно читати або записувати великі обсяги даних.
- Коли потрібно оптимізувати роботу з файлом, зменшивши кількість звернень до диска.
Ці потоки забезпечують ефективну роботу з введенням і виведенням даних, особливо при роботі з файлами або іншими джерелами, де операції з кожним байтом можуть бути повільними.
Буферизовані потоки BufferedInputStream та BufferedOutputStream