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.

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
FileReaderalkalmazta a platform alapértelmezett karakterkészletét. Adjon át egy karakterkészletet explicit módon, példáulnew 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.
