Буферизація символьних потоків. BufferedReader та BufferedWriter
Буферизація символьних потоків в Java забезпечується класами BufferedReader та BufferedWriter. Ці класи використовують внутрішні буфери для підвищення ефективності роботи з текстовими файлами. Завдяки буферизації читання та запис даних відбуваються не по одному символу, а блоками, що значно покращує продуктивність при роботі з великими обсягами текстових даних.
BufferedReader
BufferedReader — це клас, що дозволяє буферизоване читання символів, рядків і масивів символів із потоку. Він обгортає інший об’єкт Reader (наприклад, FileReader) і зчитує великі блоки даних за один раз, а не окремі символи.
Основні методи:
- read() — зчитує один символ або масив символів.
- readLine() — зчитує весь рядок до символа нового рядка.
- ready() — перевіряє, чи готовий потік до читання (повертає true, якщо є символи для читання).
- close() — закриває потік і звільняє ресурси.
Приклад використання BufferedReader:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader(“example.txt”))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line); // Виводимо кожен рядок файлу
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
У цьому прикладі метод `readLine()` зчитує рядок за рядком із файлу, що значно зручніше для роботи з текстовими даними.
BufferedWriter
BufferedWriter забезпечує буферизований запис символів у вихідний потік, наприклад, у файл. Він обгортає інший об’єкт Writer (наприклад, FileWriter) і зберігає дані у внутрішньому буфері, перш ніж записати їх у файл. Це зменшує кількість операцій запису і підвищує ефективність роботи.
Основні методи:
- write(String s) — записує рядок або масив символів у буфер.
- newLine() — додає символ нового рядка (автоматично визначає потрібний формат залежно від операційної системи).
- flush() — примусово записує вміст буфера у файл.
- close() — закриває потік і записує всі дані з буфера.
Приклад використання BufferedWriter:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(“output.txt”))) {
writer.write(“Hello, BufferedWriter!”);
writer.newLine(); // Додаємо новий рядок
writer.write(“Це приклад буферизованого запису.”);
} catch (IOException e) {
e.printStackTrace();
}
}
}
У цьому прикладі метод write() записує рядки у файл, а newLine() автоматично додає символ нового рядка залежно від операційної системи. flush() викликається автоматично при закритті потоку, тому немає потреби викликати його вручну.
Переваги буферизації:
1. Підвищення проуктивності: Буферизовані потоки читають і записують блоки даних, зменшуючи кількість операцій введення/виведення.
2. Зручна робота з рядками: Класи BufferedReader і BufferedWriter забезпечують зручні методи для роботи з рядками (readLine() та newLine()).
3. Ефективне використання ресурсів: Менша кількість операцій введення/виведення зменшує навантаження на систему.
Використання буферизованих потоків:
Буферизовані потоки зазвичай використовують разом із класами `FileReader` і `FileWriter` для роботи з текстовими файлами:
BufferedReader reader = new BufferedReader(new FileReader(“example.txt”));
BufferedWriter writer = new BufferedWriter(new FileWriter(“output.txt”));
Підсумок:
- BufferedReader підходить для ефективного читання текстових даних, зокрема зручний для читання файлів рядок за рядком.
- BufferedWriter забезпечує ефективний запис текстових даних, дозволяючи зменшити кількість операцій запису завдяки буферизації.
- Буферизація збільшує продуктивність за рахунок зменшення кількості операцій введення/виведення на диск.
Буферизація символьних потоків. BufferedReader та BufferedWriter