BufferedReader vs Console vs Scanner Java-ban
1. Áttekintés
Ebben a cikkben fogunk végigjárni a különbségeket BufferedReader, Konzol, és Scanner osztályok Java-ban.
Az egyes témák mély elmélyüléséhez javasoljuk, hogy nézze meg a Java Scanner, a Java konzol I / O és a BufferedReader cikkeket.
2. Felhasználói bemenet
Tekintettel a kivitelezőknek átadott mögöttes áramra, mindkét BufferedReader és Scanner osztályok a felhasználói bevitel szélesebb körét képesek kezelni, például egy karakterlánc, fájl, rendszerkonzol (amely általában a billentyűzethez van csatlakoztatva) és a foglalat.
Másrészt a Konzol osztály úgy van kialakítva, hogy csak az aktuális Java virtuális géphez társított karakteralapú rendszerkonzolt érje el, ha van ilyen.
Vessünk egy pillantást a BufferedReader kivitelezők, amelyek különböző bemeneteket fogadnak el:
BufferedReader br = new BufferedReader (új StringReader ("Bufferedreader vs Console vs Scanner in Java")); BufferedReader br = new BufferedReader (új FileReader ("file.txt")); BufferedReader br = new BufferedReader (új InputStreamReader (System.in)) Socket socket = új Socket (hostName, portNumber); BufferedReader br = new BufferedReader (új InputStreamReader (socket.getInputStream ()));
A Scanner osztály hasonlóan elfogadhatna különböző bemeneteket a konstruktoraiban is:
Scanner sc = new Scanner ("Bufferedreader vs Console vs Scanner in Java") Szkenner sc = new Scanner (új File ("file.txt")); Scanner sc = új szkenner (System.in); Socket socket = új Socket (hostName, portNumber); Scanner sc = new Scanner (socket.getInputStream ());
A Konzol osztály csak a method híváson keresztül érhető el:
Konzol konzol = System.console ();
Kérjük, ne feledje, hogy amikor a Konzol osztályban a JVM társított rendszerkonzol nem áll rendelkezésre, ha a kódot egy IDE-n belül futtatjuk, például Eclipse vagy IntelliJ IDEA.
3. Felhasználói kimenet
Szemben BufferedReader és Scanner osztályok, amelyek nem írnak semmit a kimeneti adatfolyamba, a Konzol osztály néhány kényelmes módszert kínál mint readPassword (String fmt, Object… args), readLine (String fmt, Object… args), és printf (karakterlánc formátum, objektum… args), hogy írja be a parancsot a rendszerkonzol kimeneti adatfolyamába:
String firstName = console.readLine ("Írja be a keresztnevét kérem:"); console.printf ("Welcome" + keresztnév);
Tehát amikor egy olyan programot írunk, amely interakcióba lép a rendszerkonzollal, Konzol osztály egyszerűsíti a kódot a felesleges eltávolításával System.out.println.
4. A bemenet elemzése
A Scanner osztály primitív típusokat és karakterláncokat elemezhet szabályos kifejezések segítségével.
A bevitelt tokenekre bontja egy egyedi elválasztó mintával, amely alapértelmezés szerint megfelel a szóköznek:
Karakterlánc bemenet = "Bufferedreader vs Console vs Scanner"; Scanner sc = new Scanner (input) .useDelimiter ("\ s * vs \ s *"); System.out.println (sc.next ()); System.out.println (sc.next ()); System.out.println (sc.next ()); sc.close ();
BufferredReader és Konzol osztályok egyszerűen beolvassák a bemeneti adatfolyamot.
5. Biztonságos adatok olvasása
A Konzol osztálynak vannak módszerei readPassword () és readPassword (karakterlánc fmt, Object… érvel) a visszhangzó, letiltott biztonságos adatok olvasása, hogy a felhasználók ne lássák, mit írnak:
Karakterlánc jelszó = String.valueOf (konzol.readPassword ("Jelszó:"));
BufferedReader és Scanner nem képesek arra.
6. Menetes
Az olvasási módszerek BufferedReader valamint az olvasási és írási módszereket Konzol mind szinkronizált, míg a Scanner osztály nem. Ha a felhasználói adatbevitelt több szálon futó programban is olvassuk, akkor azt is BufferedReader vagy Konzol jobb lehetőség lesz.
7. Pufferméret
A puffer mérete 8 KB BufferedReader 1 KB-hoz képest Scanner osztály.
Ezen felül megadhatjuk a puffer méretét a a BufferedReader osztály, ha szükséges. Ez segítséget nyújt a hosszú karakterláncok felhasználói bemenetről történő olvasásakor. Konzol osztálynak nincs puffere, ha a rendszerkonzolról olvas, de van egy pufferelt kimeneti folyama, amelyet a rendszerkonzolra kell írni.
8. Vegyes
Van néhány különbség, amelyek nem a legfontosabb tényezők, amelyeket figyelembe veszünk, amikor kiválasztjuk a megfelelő osztályt a különböző helyzetekben való felhasználáshoz.
8.1. Az Input Stream bezárása
Miután létrehoztuk a BufferedReader vagy Scanner, meg kell ne felejtse el bezárni, hogy elkerülje a memória szivárgását. De ez nem történik meg a Konzol osztály - használat után nem kell bezárnunk a rendszerkonzolt.
8.2. Kivételek kezelése
Míg Scanner és Konzol menjen az ellenőrizetlen kivétel megközelítéssel, a módszerekkel BufferedReader dobja be az ellenőrzött kivételeket, ami arra kényszerít minket, hogy a kivételek kezeléséhez írjuk be a kazánpróba-fogási szintaxist.
9. Következtetés
Most, hogy megállapítottuk az ezen osztályok közötti különbségeket, találjunk ki néhányat ökölszabályok arról, hogy melyik (ek) a legalkalmasabbak a különböző helyzetek kezelésére:
- Használat BufferedReader ha hosszú húrokat kell elolvasnunk egy fájlból, mivel jobb teljesítményt nyújt, mint a Scanner
- Fontolgat Konzol ha biztonságos adatokat olvasunk a rendszerkonzolról, és el akarjuk rejteni a gépeltet
- Használat Scanner ha a bemeneti adatfolyamot egyéni reguláris kifejezéssel kell elemeznünk
- Scanner előnyösebb, ha a rendszerkonzollal lépünk kapcsolatba, mivel az részletgazdag módszereket kínál a bemeneti adatfolyam beolvasására és elemzésére. Ezenkívül a teljesítmény-hátrány nem jelent nagy problémát, mivel a legtöbb esetben a következőXXX A módszerek blokkolják, és várják a kézi bevitelt
- Szálbiztos környezetben fontolja meg BufferedReader hacsak nem a Konzol osztály