Java BufferedReader: Як прочитати файл за допомогою прикладу

⚡ Розумний підсумок

Java BufferedReader зчитує текст з вхідного потоку шляхом буферизації символів, що робить читання файлів рядок за рядком швидким та простим. Перенесенняping FileReader всередині BufferedReader та туалетping на readLine, доки не поверне null, друкує весь файл.

  • ???? Основна мета: BufferedReader обгортає будь-який Reader, операції читання якого є ресурсоємними, зменшуючи кількість окремих читань відносно базового потоку.
  • 🔁 Цикл читання: readLine повертає один рядок на виклик та null в кінці файлу, тому цикл while для цього результату обходить увесь файл.
  • 🧱 Вигнані шляхи: A Windows шлях всередині Java Рядок потребує подвійної зворотної скісної риски, інакше компілятор відхилить недійсну керуючу послідовність.
  • ♻️ Вивільнення ресурсів: Закриття програми читання звільняє дескриптор базового файлу; try-with-resources виконує це закриття автоматично.
  • ⌨️ Вхід консолі: Обернітьping System.in в InputStreamReader дозволяє тому ж класу зчитувати ввід з клавіатури, а не файл.
  • 🇧🇷 Контрастність сканера: BufferedReader працює швидше та повертає необроблені рядки, тоді як Scanner аналізує токени та примітивні типи безпосередньо.
  • 🔤 Застереження щодо кодування: FileReader застосовує кодування за замовчуванням, тому явне вказівка ​​одного з них дозволяє уникнути спотворених символів на різних машинах.

BufferedReader в Java

Як прочитати файл в 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. Відкривайте новий зчитувач для кожного проходу через файл.

Поширені запитання

Так. Другий аргумент конструктора встановлює буфер у символах, наприклад new BufferedReader(reader, 16384)Значення за замовчуванням 8192 підходить для більшості файлів; його підвищення допомагає лише при дуже великих послідовних зчитуваннях.

Для невеликих файлів так — повертає список рядків за один виклик. Для великих файлів перевага надається Files.newBufferedReader or Files.lines, оскільки readAllLines зберігає весь файл у пам'яті одночасно.

Так. AI Помічники переписують очищення finally-block у try-with-resources та пропонують еквіваленти NIO. Після цього перевіряють кодування та поведінку винятків, оскільки згенеровані перетворення часто втрачають явне кодування.

Штучний інтелект зчитує стек trace та визначає, чи є причиною неправильний робочий каталог, відсутній дозвіл чи невідповідність кодування. Це скорочує діагностику, хоча виправлення все одно потребує перевірки щодо справжнього файлу.

Ні. readLine видаляє символ завершення рядка, тому повернутий рядок не містить символу нового рядка. Таким чином, порожній рядок у файлі повертає порожній рядок, а не null.

Підсумуйте цей пост за допомогою: