BufferedReader vs Console vs Scanner di Java

1. Gambaran keseluruhan

Dalam artikel ini, kita akan membahas perbezaan antara kelas BufferedReader , Console , dan Scanner di Java .

Untuk menyelami setiap topik, kami sarankan untuk melihat artikel individu kami mengenai Java Scanner, Konsol I / O di Java, dan BufferedReader.

2. Input Pengguna

Memandangkan aliran asas yang dilalui kepada konstruktor, kedua-dua kelas BufferedReader dan Scanner dapat menangani pelbagai input pengguna yang lebih luas , seperti rentetan, fail, konsol sistem (yang biasanya disambungkan ke papan kekunci), dan soket.

Sebaliknya, kelas Konsol direka untuk hanya mengakses konsol sistem berdasarkan watak, jika ada, yang dikaitkan dengan mesin maya Java semasa.

Mari kita lihat konstruktor BufferedReader , yang menerima input berbeza:

BufferedReader br = new BufferedReader( new StringReader("Bufferedreader vs Console vs Scanner in Java")); BufferedReader br = new BufferedReader( new FileReader("file.txt")); BufferedReader br = new BufferedReader( new InputStreamReader(System.in)) Socket socket = new Socket(hostName, portNumber); BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream())); 

The Scanner kelas sama dapat menerima input yang berbeza dalam kategori pengeluar dan juga:

Scanner sc = new Scanner("Bufferedreader vs Console vs Scanner in Java") Scanner sc = new Scanner(new File("file.txt")); Scanner sc = new Scanner(System.in); Socket socket = new Socket(hostName, portNumber); Scanner sc = new Scanner(socket.getInputStream());

The Console kelas disediakan hanya melalui panggilan kaedah:

Console console = System.console();

Perlu diingat bahawa semasa kami menggunakan kelas Konsol , konsol sistem yang berkaitan dengan JVM tidak tersedia jika kami menjalankan kod dalam IDE seperti Eclipse atau IntelliJ IDEA.

3. Keluaran Pengguna

Berbeza dengan kelas BufferedReader dan Scanner , yang tidak menulis apa-apa ke aliran output, kelas Console menawarkan beberapa kaedah yang mudah seperti readPassword (String fmt, Object… args), readLine (String fmt, Object… args), dan printf ( Format rentetan, Objek… args) , untuk menulis arahan ke aliran output konsol sistem :

String firstName = console.readLine("Enter your first name please: "); console.printf("Welcome " + firstName );

Oleh itu, semasa kita menulis program untuk berinteraksi dengan konsol sistem, kelas Konsol akan mempermudah kodnya dengan membuang System.out.println yang tidak perlu .

4. Menghuraikan Input

The Scanner kelas boleh menghuraikan jenis primitif dan tali menggunakan ungkapan biasa .

Ini memecah inputnya menjadi token menggunakan corak pembatas khusus, yang secara lalai sesuai dengan ruang kosong:

String input = "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();

Kelas BufferredReader dan Console hanya membaca aliran input sebagaimana adanya.

5. Membaca Data Selamat

The Console kelas mempunyai kaedah readPassword () dan readPassword (String FMT , Objek ... args) untuk membaca data selamat dengan mengulangi kurang upaya jadi pengguna tidak akan melihat apa yang mereka menaip:

String password = String.valueOf(console.readPassword("Password :")); 

BufferedReader dan Scanner tidak mempunyai kemampuan untuk melakukannya.

6. Benang Selamat

Kaedah membaca di BufferedReader dan kaedah membaca dan menulis di Konsol semuanya diselaraskan , sedangkan kaedah di kelas Pengimbas tidak. Sekiranya kita membaca input pengguna dalam program multi-utas, baik BufferedReader atau Konsol akan menjadi pilihan yang lebih baik.

7. Ukuran Penampan

Ukuran buffer adalah 8 KB di BufferedReader berbanding 1 KB di kelas Scanner .

Di samping itu, kita dapat menentukan ukuran buffer dalam konstruktor kelas BufferedReader jika diperlukan. Ini akan membantu semasa membaca rentetan panjang dari input pengguna. Kelas konsol tidak mempunyai penyangga ketika membaca dari konsol sistem , tetapi mempunyai aliran output yang disangga untuk menulis ke konsol sistem.

8. Pelbagai

Terdapat beberapa perbezaan yang bukan merupakan faktor utama yang kita pertimbangkan ketika memilih kelas yang sesuai untuk digunakan dalam pelbagai situasi.

8.1. Menutup Aliran Input

Sebaik sahaja kita membuat contoh BufferedReader atau Scanner , kita harus ingat untuk menutupnya untuk mengelakkan kebocoran memori . Tetapi ini tidak berlaku dengan kelas Konsol - kita tidak perlu menutup konsol sistem setelah digunakan.

8.2. Pengendalian Pengecualian

Walaupun Pengimbas dan Konsol menggunakan pendekatan pengecualian yang tidak diperiksa , kaedah dalam pengecualian lontaran diperiksa BufferedReader , yang memaksa kita menulis sintaks cubaan tangkapan boilerplate untuk menangani pengecualian.

9. Kesimpulannya

Sekarang setelah kami menyatakan perbezaan di antara kelas-kelas ini, mari kita tentukan beberapa aturan praktikal mengenai mana yang paling sesuai untuk menangani situasi yang berbeza :

  • Gunakan BufferedReader jika kita perlu membaca rentetan panjang dari fail, kerana ia mempunyai prestasi yang lebih baik daripada Scanner
  • Pertimbangkan Konsol jika kita membaca data selamat dari konsol sistem dan ingin menyembunyikan apa yang sedang ditaip
  • Gunakan Pengimbas jika kita perlu menguraikan aliran input dengan ungkapan biasa tersuai
  • Pengimbas akan lebih disukai ketika kita berinteraksi dengan konsol sistem, kerana ia menawarkan kaedah halus untuk membaca dan mengurai aliran input. Di samping itu, kelemahan prestasi bukanlah masalah besar, kerana dalam kebanyakan kes, kaedah XXX seterusnya menyekat dan menunggu input manual
  • Dalam konteks selamat utas, pertimbangkan BufferedReader melainkan kita harus menggunakan ciri khusus untuk kelas Konsol