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

⚡ Умно обобщение

Java BufferedReader чете текст от входен поток чрез буфериране на символи, което прави четенето на файлове ред по ред бързо и лесно. Wrapping FileReader вътре BufferedReader и тоалетнаping на readLine, докато не върне null, отпечатва целия файл.

  • 📖 Основна цел: BufferedReader обгръща всеки Reader, чиито операции за четене са скъпи, намалявайки отделните четения спрямо основния поток.
  • 🔁 Цикъл на четене: readLine връща по един ред на извикване и null в края на файла, така че цикъл while върху този резултат обхожда целия файл.
  • 🧱 Избягали пътища: A Windows път вътре в Java Низът се нуждае от двойна обратна наклонена черта, в противен случай компилаторът отхвърля невалидната escape последователност.
  • Освобождаване на ресурсите: Затварянето на четеца освобождава основния файлов дескриптор; 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() изпълнява се независимо дали е хвърлено изключение, което освобождава основния файлов дескриптор и запазва управление на паметта предвидимо. Вложената функция 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. Отваряйте нов четец за всяко преминаване през файла.

Въпроси и Отговори

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

За малки файлове, да — връща списък с редове с едно извикване. За големи файлове е по-добре Files.newBufferedReader or Files.lines, защото readAllLines съхранява целия файл в паметта наведнъж.

Да. AI Асистентите пренаписват finally-block cleanup в try-with-resources и предлагат NIO еквиваленти. След това проверете поведението на кодировката и изключенията, тъй като генерираните реализации често пропускат изричното кодиране.

Изкуственият интелект чете стека trace и идентифицира дали причината е грешна работна директория, липсващо разрешение или несъответствие в кодирането. Това съкращава диагнозата, въпреки че поправката все още се нуждае от проверка спрямо реалния файл.

Не. readLine премахва края на реда, така че върнатият String не съдържа завършващ нов ред. Следователно празен ред във файла връща празен String, а не null.

Обобщете тази публикация с: