Буферизовані потоки 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();
}
}
}

Переваги буферизованих потоків:

  1. Покращена продуктивність: Буферизація зменшує кількість викликів до фізичних пристроїв введення-виведення (таких як диск або мережа), що значно прискорює роботу з великими обсягами даних.
  2. Зменшення кількості операцій з диском: Замість того, щоб записувати або читати дані по одному байту, буферизовані потоки працюють із блоками даних.
  3. Зручність використання: Вони легко інтегруються з іншими потоками, такими як FileInputStream та FileOutputStream.

Як працює буферизація:

  • Читання: Коли ви читаєте з буферизованого потоку, спочатку зчитується цілий блок даних у буфер, а потім окремі байти передаються програмі з цього буфера. Якщо буфер закінчився, завантажується новий блок даних.
  • Запис: Дані спочатку записуються в буфер. Як тільки буфер заповнений або явно викликаний метод flush(), усі дані записуються в цільовий потік (наприклад, файл).

Коли використовувати:

  • Коли необхідно читати або записувати великі обсяги даних.
  • Коли потрібно оптимізувати роботу з файлом, зменшивши кількість звернень до диска.

Ці потоки забезпечують ефективну роботу з введенням і виведенням даних, особливо при роботі з файлами або іншими джерелами, де операції з кожним байтом можуть бути повільними.

Буферизовані потоки BufferedInputStream та BufferedOutputStream