Java BufferedReader: Як прочитати файл за допомогою прикладу
⚡ Розумний підсумок
Java BufferedReader зчитує текст з вхідного потоку шляхом буферизації символів, що робить читання файлів рядок за рядком швидким та простим. Перенесенняping FileReader всередині BufferedReader та туалетping на readLine, доки не поверне null, друкує весь файл.
Як прочитати файл в Java?
Java надає кілька механізмів для читання з файлу. Найкорисніший пакет для цього - java.io, чий пресtract Reader Клас визначає читання потоку символів. java.io.BufferedReader — це конкретний підклас, що використовується для ефективного читання по рядках.
Що таке BufferedReader в Java?
BufferedReader це Java Клас, який зчитує текст із вхідного потоку, такого як файл, шляхом буферизації символів, щоб символи, масиви та рядки зчитувалися ефективно. Без буферизації кожен запит на читання, зроблений класом Reader, запускає відповідний запит на читання для базового потоку символів або байтів.
Тому бажано укутати BufferedReader навколо будь-якого Reader, чий read() операції можуть бути дорогими, наприклад FileReader та InputStreamReaderТипове використання передає шлях до файлу зчитувальному засобу наступним чином:
// Note the doubled backslash: a single \ starts an escape sequence objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt"));
Це завантажує файл у objReaderПотім ви перебираєте вміст файлу та друкуєте кожен рядок. Цикл while у коді нижче зчитує файл, доки не досягне кінця файлу.
while ((strCurrentLine = objReader.readLine()) != null) { System.out.println(strCurrentLine); }
strCurrentLine утримує поточний рядок, і objReader.readLine() повертає рядок. Таким чином, цикл продовжує ітерувати, доки повернене значення не дорівнює null, і зупиняється на першому null, що сигналізує про кінець файлу.
BufferПриклад edReader
Наведений нижче код є повним Java BufferПриклад edReader:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFileExample { public static void main(String[] args) { BufferedReader objReader = null; try { String strCurrentLine; objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt")); while ((strCurrentLine = objReader.readLine()) != null) { System.out.println(strCurrentLine); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (objReader != null) objReader.close(); } catch (IOException ex) { ex.printStackTrace(); } } } }
Примітка: Команда finally блок має значення. Це гарантує, що objReader.close() виконується незалежно від того, чи був викинутий виняток, що звільняє дескриптор базового файлу та зберігає управління пам'яттю передбачувано. Вкладена спроба всередині finally потрібно, тому що close() сама заявляє IOException.
BufferПриклад edReader JDK7
Починаючи з JDK 7, try-with-resources видаляє finally блокувати повністю. Будь-який ресурс, оголошений у дужках try Оператор автоматично закривається після завершення блоку, у зворотному порядку створення, навіть якщо поширюється виняток:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFileExample_jdk7 { private static final String FILENAME = "D:\\DukesDiary.txt"; public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new FileReader(FILENAME))) { String strCurrentLine; while ((strCurrentLine = br.readLine()) != null) { System.out.println(strCurrentLine); } } catch (IOException e) { e.printStackTrace(); } } }
Ця версія коротша та безпечніша, тому саме їй слід надавати перевагу в новому коді. Читання файлу — це лише одне з застосувань класу; у наступному розділі його порівнюють з альтернативою, до якої більшість новачків звертаються спочатку.
BufferedReader проти сканера: що використовувати
Обидва класи читають текст, і новачки часто вибирають один довільно. Вони вирішують різні задачі, і неправильний вибір проявляється або як незграбний ручний розбір, або як низька пропускна здатність, коли вхідні дані зростають до тисяч рядків. У таблиці нижче вони поставлені поруч.
| Аспект | BufferedReader | Scanner |
|---|---|---|
| Повернення | Цілі рядки як String | Розібрані токени та примітиви |
| Вбудований парсинг | Ні — ви розщеплюєте або навертаєтесь самі | Так — nextInt, наступнийDouble, наступний рядок |
| Буфер за замовчуванням | символи 8192 | символи 1024 |
| Швидкість роботи з великими файлами | Швидше | Повільніше, через токенізацію регулярних виразів |
| Безпека потоків | Syncхронізований | Не синхронізовано |
| Найкраще для | Читання великих файлів рядок за рядком | Невеликий інтерактивний вхід, що потребує введених значень |
Оберіть BufferedReader, коли метою є швидке переміщення по файлу та обробка тексту самостійно, та Scanner, коли вам потрібні введені значення без написання коду перетворення. Розділення кожного повернутого рядка за допомогою Метод розбиття рядків дає BufferedReader використовує більшість зручностей сканера на вищій швидкості.
Як читати ввід консолі за допомогою BufferedReader
Той самий клас зчитує введені з клавіатури дані, що корисно для невеликих програм командного рядка та для введення даних у складних завданнях з кодування. System.in є потоком байтів, тому його не можна передати Bufferбезпосередньо в edReader. An InputStreamReader з'єднує байти з символами та BufferПотім edReader додає ефективне читання рядків поверх цього мосту.
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class ReadConsoleExample { public static void main(String[] args) throws IOException { // Bridge the System.in byte stream to a character stream try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) { System.out.print("Enter your name: "); String name = reader.readLine(); System.out.print("Enter your age: "); // readLine always returns text, so convert it explicitly int age = Integer.parseInt(reader.readLine().trim()); System.out.println("Hello " + name + ", age " + age); } } }
Варто пам’ятати три деталі. По-перше, readLine() завжди повертає рядок, тому числовий ввід має бути перетворений за допомогою Integer.parseInt або подібне, а нечисловий запис видає NumberFormatException — завершити перетворення, якщо вхідні дані ненадійні. По-друге, виклик .trim() видаляє символ повернення каретки в кінці, який Windows консолі додають, що є частою причиною збоїв розбору. По-третє, уникайте закриття читача, обгорнутого навколо System.in якщо програмі все ще потрібен ввід консолі пізніше, оскільки закриття обгортки назавжди закриває базовий потік для цього процесу.
Для програм, які зчитують багато значень, зчитування одного рядка та його розділення набагато швидше, ніж виклик readLine() багаторазово, оскільки кожен виклик переходить в операційну систему лише тоді, коли буфер спорожніє. Це основна причина, чому програмісти-спортсмени віддають перевагу BufferedReader замість сканера для масового введення.
Навіть з правильним кодом, кілька помилок з'являються повторювано.
загальний BufferПомилки edReader та як їх виправити
міст BufferЗбої edReader виникають через шляхи до файлів, обробку ресурсів або кодування символів, а не через сам цикл читання. Кожна помилка нижче містить назву свого винятку та способу виправлення.
- Недопустимий символ виходу: шлях використовує одну зворотну скісну риску, як у
"D:\DukesDiary.txt". Double це до"D:\\DukesDiary.txt"або використовуйте косу риску вперед, яка Java приймає Windows. - Виняток FileNotFound: шлях вказується відносно робочого каталогу, а не вихідного файлу. Друк
new File(name).getAbsolutePath()побачити, де Java насправді шукає. - NullPointerException при першому читанні: Зчитувач ніколи не був призначений, оскільки конструктор викинув виняток, і виняток був проковтнутий. Перевірте обробка винятків перед циклом.
- Спотворені символи або символи питання: файл у кодуванні UTF-8, але
FileReaderзастосовано кодування платформи за замовчуванням. Наприклад, передайте кодування явноnew InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8). - Трансляцію закрито: Зчитувач було закрито всередині циклу або використано повторно після завершення try-with-resources. Відкривайте новий зчитувач для кожного проходу через файл.

