Java BufferedReader: Как прочитать файл на примере

⚡ Умное резюме

Java BufferedReader считывает текст из входного потока, буферизуя символы, что делает построчное чтение файлов быстрым и простым.ping внутри BufferedReader и looping Функция readLine, которая возвращает null, выводит содержимое всего файла.

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

BufferedReader в Java

Как прочитать файл в Java?

Java Предоставляет несколько механизмов для чтения из файла. Наиболее полезным для этого является пакет [название пакета]. java.io, чьи прессtract Reader Этот класс определяет чтение символьного потока. java.io.BufferedReader Это конкретный подкласс, используемый для эффективного построчного чтения.

Что такое BufferedReader в Java?

BufferЭдРидер - это Java Класс, который считывает текст из входного потока, например, файла, путем буферизации символов, чтобы символы, массивы и строки считывались эффективно. Без буферизации каждый запрос на чтение, сделанный объектом Reader, запускает соответствующий запрос на чтение базового символьного или байтового потока.

Поэтому желательно завернуть BufferedReader вокруг любого читателя, чей 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 против сканера: что использовать?

Оба класса программируют текст, и новички часто выбирают один из них произвольно. Они решают разные задачи, и неправильный выбор проявляется либо в неуклюжем ручном анализе, либо в низкой производительности, когда объем входных данных достигает тысяч строк. В таблице ниже они представлены рядом.

Аспект BufferЭдРидер Сканер
Returns Целые строки в виде строк Разобранные токены и примитивы
Встроенный парсинг Нет — вы сами разделяетесь или обращаетесь в другую веру. Да — nextInt, nextDouble, следующая строка
Буфер по умолчанию 8192 1024
Скорость обработки больших файлов Быстрее Медленнее из-за токенизации с помощью регулярных выражений.
Безопасность резьбы Syncхронизированный Не синхронизировано
лучше всего для Построчное чтение больших файлов Небольшой интерактивный элемент ввода, требующий ввода значений.

Выбирайте BufferedReader подходит, когда цель — быстро перемещаться по файлу и самостоятельно обрабатывать текст, а Scanner — когда нужны введенные значения без написания кода преобразования. Разделение каждой возвращенной строки с помощью Метод разделения строки дает BufferedReader обеспечивает большую часть удобств сканера на более высокой скорости.

Как считывать ввод с консоли с помощью BufferЭдРидер

Этот же класс считывает ввод с клавиатуры, что полезно для небольших программ командной строки и для ввода данных в заданиях по программированию. System.in Это поток байтов, поэтому его нельзя передать другому устройству. BufferedReader напрямую. 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.
  • FileNotFoundException: Путь указывается относительно рабочей директории, а не исходного файла. new File(name).getAbsolutePath() чтобы увидеть где Java Он действительно смотрит.
  • Ошибка NullPointerException при первом чтении: Объект reader так и не был назначен, потому что конструктор вызвал исключение, и оно было проигнорировано. Проверьте Обработка исключений перед циклом.
  • Неразборчивые символы или символы вопросительного знака: Файл в кодировке UTF-8, но FileReader Применяется кодировка по умолчанию платформы. Кодировку можно указать явно, например: new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8).
  • Трансляция закрыта: Функция чтения была закрыта внутри цикла или повторно использована после завершения цикла try-with-resources. Открывайте новую функцию чтения для каждого прохода по файлу.

Часто задаваемые вопросы (FAQ)

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

Для небольших файлов — да, возвращает список строк за один вызов. Для больших файлов предпочтительнее. Files.newBufferedReader or Files.lines, потому что функция readAllLines удерживает весь файл в памяти одновременно.

Да. AI Вспомогательные функции переписывают очистку блока finally в конструкцию try-with-resources и предлагают эквиваленты NIO. После этого проверьте кодировку и поведение при обработке исключений, поскольку сгенерированные преобразования часто теряют явное кодирование.

Искусственный интеллект считывает данные из стека. trace и определяет, является ли причиной неправильный рабочий каталог, отсутствующие права доступа или несоответствие кодировки. Это сокращает время диагностики, хотя исправление все еще требует проверки на реальном файле.

Нет. Функция readLine удаляет символ конца строки, поэтому возвращаемая строка не содержит завершающего символа новой строки. Следовательно, пустая строка в файле возвращает пустую строку, а не null.

Подведем итог этой публикации следующим образом: