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