Java BufferedReader: Fájl olvasása példával

⚡ Okos összefoglaló

Java BufferAz edReader karakterek pufferelésével olvassa be a szöveget a bemeneti adatfolyamból, ami gyorssá és egyszerűvé teszi a soronkénti fájlolvasást.ping egy FileReader belül BufferedReader és WCping A readLine-on a null értéket visszaadó értékig kinyomtatja a teljes fájlt.

  • ???? Fő cél: BufferAz edReader minden költséges olvasási művelettel rendelkező Readert becsomagol, csökkentve az egyes olvasások számát az alapul szolgáló adatfolyamhoz képest.
  • 🔁 Olvasási ciklus: A readLine hívásonként egy sort és a fájl végét null értékkel tér vissza, így egy while ciklus ezen az eredményen végigjárja az egész fájlt.
  • 🧱 Megszökött utak: A Windows út egy belsejében Java A karakterláncban dupla fordított perjelre van szükség, ellenkező esetben a fordító elutasítja az érvénytelen escape-szekvenciát.
  • ♻️ Erőforrás kiadása: Az olvasó bezárása felszabadítja az alapul szolgáló fájlkezelőt; a try-with-resources automatikusan végrehajtja ezt a bezárást.
  • ⌨️ Konzol bemenet: Tekerjükping Egy InputStreamReaderben a System.in lehetővé teszi ugyanazon osztály számára, hogy billentyűzetbemenetet olvasson be fájl helyett.
  • 🇧🇷 Szkenner kontrasztja: BufferAz edReader gyorsabb és nyers sorokat ad vissza, míg a Scanner közvetlenül elemzi a tokeneket és a primitív típusokat.
  • 🔤 Karakterkészlettel kapcsolatos figyelmeztetés: A FileReader az alapértelmezett karakterkészletet alkalmazza, így ha explicit módon megadja, az elkerüli a karakterek olvasását a gépek között.

BufferedReader be Java

Hogyan lehet beolvasni egy fájlt Java?

Java számos mechanizmust kínál a fájlokból való olvasáshoz. Ehhez a leghasznosabb csomag a java.io, akinek a hasizmaitract Reader Az osztály definiálja a karakterfolyam-olvasást. java.io.BufferedReader a hatékony soralapú olvasáshoz használt konkrét alosztály.

Mi a BufferedReader be Java?

BufferedReader egy olyan Java Egy olyan osztály, amely egy bemeneti adatfolyamból, például egy fájlból, szöveget olvas be karakterek pufferelésével, hogy a karakterek, tömbök és sorok hatékonyan legyenek beolvasva. Pufferelés nélkül minden egyes, a Readertől érkező olvasási kérés egy megfelelő olvasási kérést indít el az alapul szolgáló karakter- vagy bájtfolyam ellen.

Ezért célszerű becsomagolni BufferedReader bármely olyan olvasó körül, amelynek read() költségesek lehetnek a műveletek, pl. FileReader és a InputStreamReaderEgy tipikus használat a következőképpen adja át a fájl elérési útját az olvasónak:

// Note the doubled backslash: a single \ starts an escape sequence
objReader = new BufferedReader(new FileReader("D:\\DukesDiary.txt"));

Ez betölti a fájlt a objReaderEzután végigmész a fájl tartalmán, és kinyomtatod az egyes sorokat. Az alábbi kódban található while ciklus a fájlt addig olvassa, amíg el nem éri a fájl végét.

while ((strCurrentLine = objReader.readLine()) != null) {
    System.out.println(strCurrentLine);
}

strCurrentLine tartja az aktuális sort, és objReader.readLine() egy karakterláncot ad vissza. A ciklus tehát addig ismétlődik, amíg a visszaadott érték nem null, és az első nullnál megáll, ami a fájl végét jelzi.

BufferedReader példa

Az alábbi kód egy teljes Java BufferedReader példa:

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();
            }
        }
    }
}

Jegyzet: Az finally A blokk számít. Garantálja, hogy objReader.close() lefut, függetlenül attól, hogy történt-e kivétel, ami felszabadítja az alapul szolgáló fájlkezelőt és megtartja a memóriakezelés kiszámítható. A beágyazott próbálkozás belül finally azért szükséges, mert close() maga kijelenti IOException.

BufferedReader JDK7 példa

A JDK 7-től kezdődően a try-with-resources eltávolítja a finally teljes egészében blokkolja. Bármely, a zárójelben deklarált erőforrás try Az utasítás automatikusan lezárul, amikor a blokk kilép, a létrehozás fordított sorrendjében, még akkor is, ha egy kivétel terjed:

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();
        }
    }
}

Ez a verzió rövidebb és biztonságosabb, ezért új kódban ezt a formát érdemes előnyben részesíteni. A fájlolvasás csak az osztály egyik felhasználási módja; a következő szakasz összehasonlítja azzal az alternatívával, amelyhez a legtöbb kezdő először nyúl.

BufferedReader vs. szkenner: Melyiket használjuk?

Mindkét kurzus szöveget olvas, és a kezdők gyakran önkényesen választanak egyet. Különböző problémákat oldanak meg, és a rossz választás vagy ügyetlen kézi elemzésként, vagy gyenge áteresztőképességként nyilvánul meg, amint a bemenet több ezer sorra nő. Az alábbi táblázat egymás mellett mutatja be őket.

Aspect BufferedReader Scanner
Visszatér Egész sorok karakterláncként Elemzett tokenek és primitívek
Beépített elemzés Nem – felosztod vagy átalakítod magad Igen — nextInt, nextDouble, következő sor
Alapértelmezett puffer 8192 karakterek 1024 karakterek
Sebesség nagy fájlokon Gyorsabb Lassabb, a regex tokenizálás miatt
Menetbiztonság Synckrónizált Nincs szinkronizálva
A legjobb Nagy fájlok soronkénti olvasása Kis interaktív bemenet, amelyhez gépelt értékek szükségesek

A pop-art design, négy időzóna kijelzése egyszerre és méretének arányai azok az érvek, amelyek a NeXtime Time Zones-t kiváló választássá teszik. Válassza a BufferedReader, ha a cél egy fájl gyors áttekintése és a szöveg saját kezű kezelése, és Scanner, ha begépelt értékekre van szüksége konverziós kód írása nélkül. A visszaadott sorok felosztása a Karakterlánc-felosztási metódus ad BufferAz edReader a szkenner kényelmének nagy részét nagyobb sebességgel használja ki.

Konzol bemenetének olvasása a következővel: BufferedReader

Ugyanez az osztály billentyűzetről érkező bemenetet olvas be, ami hasznos kis parancssori programokhoz és kódolási kihívást jelentő bevitelhez. System.in egy bájtfolyam, így nem adható át Bufferközvetlenül az edReaderben. Egy InputStreamReader bájtokat köt karakterekké, és BufferAz edReader ezután hatékony sorolvasást ad hozzá ehhez a hídhoz.

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);
        }
    }
}

Három részletre érdemes emlékezni. Először is, readLine() mindig karakterláncot ad vissza, ezért a numerikus bemenetet át kell alakítani Integer.parseInt vagy hasonló, és egy nem numerikus bejegyzés a következőt dobja: NumberFormatException — a konverziót becsomagolja, ha a bemenet nem megbízható. Másodszor, a hívás .trim() eltávolítja a kocsivissza karaktert, amely a végén található. Windows konzolok hozzáfűzése, ami az elemzési hibák gyakori oka. Harmadszor, kerülje a olvasó bezárását, amely a System.in ha a programnak később továbbra is szüksége van konzol bemenetre, mivel a wrapper bezárása véglegesen bezárja az adott folyamat mögöttes adatfolyamát.

Azoknál a programoknál, amelyek sok értéket olvasnak be, egy sor beolvasása és felosztása sokkal gyorsabb, mint a hívás. readLine() ismételten, mivel minden hívás csak akkor kerül be az operációs rendszerbe, amikor a puffer kiürül. Ez a fő oka annak, hogy a versenyző programozók ezt részesítik előnyben BufferedReader szkenneren keresztül tömeges bevitelhez.

Még helyes kód esetén is számos hiba ismétlődik.

Közös BufferedReader hibák és azok javítása

híd BufferAz edReader hibái fájlelérési utakból, erőforrás-kezelésből vagy karakterkódolásból erednek, nem pedig magából az olvasási ciklusból. Az alábbi hibák mindegyike megnevezi a kivételét és a javítását.

  • Érvénytelen escape karakter: az elérési út egyetlen fordított perjelet használ, mint például "D:\DukesDiary.txt". Double hogy "D:\\DukesDiary.txt", vagy használjon perjelet, amely Java elfogadja Windows.
  • FileNotFoundException: az elérési út a munkakönyvtárhoz képest értendő, nem a forrásfájlhoz. Nyomtatás new File(name).getAbsolutePath() hogy lássam, hol Java valójában keresi.
  • NullPointerException az első olvasáskor: az olvasót sosem rendelték hozzá, mert a konstruktor dobott, és a kivételt lenyelte. Ellenőrizd a kivétel kezelése a hurok előtt.
  • Érthetetlen vagy kérdőjeles karakterek: a fájl UTF-8 formátumú, de FileReader alkalmazta a platform alapértelmezett karakterkészletét. Adjon át egy karakterkészletet explicit módon, például new InputStreamReader(new FileInputStream(f), StandardCharsets.UTF_8).
  • Lezárva a stream: Az olvasót lezárták a cikluson belül, vagy újrafelhasználták a try-with-resources befejezése után. Nyisson meg egy új olvasót minden egyes fájlon való áthaladáshoz.

GYIK

Igen. Egy második konstruktor argumentum karakterekben állítja be a puffert, például new BufferedReader(reader, 16384)Az alapértelmezett 8192 a legtöbb fájlnak megfelel; a növelése csak nagyon nagy szekvenciális olvasásoknál segít.

Kis fájlok esetén igen — egyetlen hívás során sorok listáját adja vissza. Nagy fájlok esetén inkább Files.newBufferedReader or Files.lines, mivel a readAllLines egyszerre tárolja a teljes fájlt a memóriában.

Igen. AI Az asszisztensek átírják a finally-block cleanup utasításokat try-with-resources formátumba, és NIO-egyenértékeket javasolnak. Utána ellenőrzik a karakterkészlet és a kivétel viselkedését, mivel a generált konverziók gyakran elhagyják az explicit kódolást.

A mesterséges intelligencia beolvassa a verem tartalmát trace, és azonosítja, hogy a hiba oka egy rossz munkakönyvtár, egy hiányzó engedély vagy egy kódolási eltérés. Lerövidíti a diagnózist, bár a javításhoz továbbra is szükség van a valódi fájllal való ellenőrzésre.

Nem. A readLine eltávolítja a sorzárót, így a visszaadott karakterlánc nem tartalmaz sortörést. Egy üres sor a fájlban ezért üres karakterláncot ad vissza null helyett.

Foglald össze ezt a bejegyzést a következőképpen: