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

Как прочитать файл в 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. Открывайте новую функцию чтения для каждого прохода по файлу.
