Java BufferedReader: Как да прочетете файл с пример
⚡ Умно обобщение
Java BufferedReader чете текст от входен поток чрез буфериране на символи, което прави четенето на файлове ред по ред бързо и лесно. Wrapping 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() изпълнява се независимо дали е хвърлено изключение, което освобождава основния файлов дескриптор и запазва управление на паметта предвидимо. Вложената функция try вътре finally е необходимо, защото close() самата тя декларира IOException.
BufferedReader 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 | Скенер |
|---|---|---|
| Връщане | Цели редове като String | Анализирани токени и примитиви |
| Вграден парсинг | Не — ти се разделяш или преобразяваш сам себе си | Да — nextInt, следващDouble, следващ ред |
| Буфер по подразбиране | 8192 герои | 1024 герои |
| Скорост при работа с големи файлове | По-бързо | По-бавно, поради токенизиране на регулярни изрази |
| Безопасност на нишките | Syncхронизиран | Не е синхронизирано |
| Най - доброто за | Четене на големи файлове ред по ред | Малък интерактивен вход, изискващ въведени стойности |
Изберете BufferedReader, когато целта е бързо да се придвижвате през файл и сами да обработвате текста, и Scanner, когато искате да въвеждате стойности, без да пишете код за преобразуване. Разделянето на всеки върнат ред с Метод за разделяне на низове дава BufferedReader използва по-голямата част от удобството на скенера с по-висока скорост.
Как да четем вход от конзолата с помощта на BufferedReader
Същият клас чете входни данни от клавиатурата, което е полезно за малки програми от команден ред и за въвеждане на данни в задачи по кодиране. System.in е байтов поток, така че не може да бъде предаден на Bufferдиректно от edReader. 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 вместо Scanner за групово въвеждане.
Дори и с правилен код, няколко грешки се появяват многократно.
Общ BufferГрешки в edReader и как да ги поправим
мост BufferГрешките в edReader възникват от файлови пътища, обработка на ресурси или кодиране на знаци, а не от самия цикъл на четене. Всяка грешка по-долу посочва своето изключение и решение.
- Недопустим символ за изход: пътят използва една обратна наклонена черта, както е в
"D:\DukesDiary.txt". Double то да"D:\\DukesDiary.txt"или използвайте наклонена черта напред, която Java приема на Windows. - Изключение на FileNotFound: пътят е относителен спрямо работната директория, а не спрямо изходния файл. Print
new File(name).getAbsolutePath()да видя къде Java всъщност търси. - NullPointerException при първо четене: Четецът никога не е бил присвоен, защото конструкторът е хвърлил изключение и изключението е било погълнато. Проверете обработка на изключения преди цикъла.
- Нечетливи или въпросителни знаци: файлът е UTF-8, но
FileReaderприложен е кодировката по подразбиране на платформата. Предайте кодировката изрично, напримерnew InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8). - Потокът е затворен: Четецът е бил затворен в цикъла или използван повторно след края на try-with-resources. Отваряйте нов четец за всяко преминаване през файла.
