BufferedReader vs Console vs Scanner di Java

1. Ikhtisar

Pada artikel ini, kita akan membahas perbedaan antara kelas BufferedReader , Console , dan Scanner di Java .

Untuk mendalami setiap topik, kami sarankan untuk melihat artikel individual kami di Java Scanner, Console I / O di Java, dan BufferedReader.

2. Masukan Pengguna

Mengingat aliran yang mendasari diteruskan ke konstruktor, kelas BufferedReader dan Scanner mampu menangani input pengguna yang lebih luas , seperti string, file, konsol sistem (yang biasanya terhubung ke keyboard), dan soket.

Di sisi lain, kelas Console dirancang untuk hanya mengakses konsol sistem berbasis karakter, jika ada, yang terkait dengan mesin virtual Java saat ini.

Mari kita lihat konstruktor BufferedReader , yang menerima input berbeda:

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

Kelas Scanner juga dapat menerima input yang berbeda dalam konstruktornya:

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

Kelas Console hanya tersedia melalui pemanggilan metode:

Console console = System.console();

Harap diingat bahwa saat kami menggunakan kelas Console , konsol sistem terkait JVM tidak tersedia jika kami menjalankan kode dalam IDE seperti Eclipse atau IntelliJ IDEA.

3. Keluaran Pengguna

Berbeda dengan kelas BufferedReader dan Scanner , yang tidak menulis apa pun ke aliran keluaran, kelas Console menawarkan beberapa metode praktis seperti readPassword (String fmt, Object… args), readLine (String fmt, Object… args), dan printf ( Format string, Object… args) , untuk menulis prompt ke aliran keluaran konsol sistem :

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

Jadi ketika kita menulis program untuk berinteraksi dengan konsol sistem, kelas Console akan menyederhanakan kode dengan menghapus System.out.println yang tidak perlu .

4. Masukan Parsing

Kelas Scanner dapat mengurai jenis dan string primitif menggunakan ekspresi reguler .

Ini memecah inputnya menjadi token menggunakan pola pembatas khusus, yang secara default cocok dengan spasi:

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

BufferredReader dan kelas Console cukup membaca input stream apa adanya.

5. Membaca Data Aman

Kelas Console memiliki metode readPassword () dan readPassword (String fmt , Object… args) untuk membaca data aman dengan echoing dinonaktifkan sehingga pengguna tidak akan melihat apa yang mereka ketikkan:

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

BufferedReader dan Scanner tidak memiliki kemampuan untuk melakukannya.

6. Aman Benang

Metode baca di BufferedReader dan metode baca dan tulis di Console semuanya disinkronkan , sedangkan di kelas Scanner tidak. Jika kita membaca input pengguna dalam program multi-threaded, BufferedReader atau Console akan menjadi pilihan yang lebih baik.

7. Ukuran Buffer

Ukuran buffer adalah 8 KB di BufferedReader dibandingkan dengan 1 KB di kelas Scanner .

Selain itu, kita dapat menentukan ukuran buffer dalam konstruktor kelas BufferedReader jika diperlukan. Ini akan membantu saat membaca string panjang dari input pengguna. Kelas konsol tidak memiliki buffer saat membaca dari konsol sistem , tetapi memiliki aliran keluaran yang di-buffer untuk menulis ke konsol sistem.

8. Lain-lain

Ada beberapa perbedaan yang bukan merupakan faktor utama yang kami pertimbangkan ketika memilih kelas yang sesuai untuk digunakan dalam berbagai situasi.

8.1. Menutup Arus Input

Setelah kita membuat instance BufferedReader atau Scanner , kita harus ingat untuk menutupnya untuk menghindari kebocoran memori . Tetapi ini tidak terjadi dengan kelas Console - kita tidak perlu menutup konsol sistem setelah digunakan.

8.2. Penanganan Pengecualian

Sementara Pemindai dan Konsol menggunakan pendekatan pengecualian yang tidak dicentang, metode di BufferedReader menampilkan pengecualian yang diperiksa, yang memaksa kita untuk menulis sintaks try-catch boilerplate untuk menangani pengecualian.

9. Kesimpulan

Sekarang kita telah menyatakan perbedaan di antara kelas-kelas ini, mari kita buat beberapa aturan praktis mengenai mana yang paling cocok untuk menangani situasi yang berbeda :

  • Gunakan BufferedReader jika kita perlu membaca string panjang dari sebuah file, karena memiliki kinerja yang lebih baik daripada Scanner
  • Pertimbangkan Konsol jika kita membaca data aman dari konsol sistem dan ingin menyembunyikan apa yang sedang diketik
  • Gunakan Pemindai jika kita perlu mengurai aliran input dengan ekspresi reguler khusus
  • Pemindai akan lebih disukai saat kita berinteraksi dengan konsol sistem, karena ia menawarkan metode yang sangat terperinci untuk membaca dan mengurai aliran input. Selain itu, kekurangan kinerja bukanlah masalah besar, karena dalam banyak kasus, metode XXX berikutnya memblokir dan menunggu input manual.
  • Dalam konteks thread-safe, pertimbangkan BufferedReader kecuali kita harus menggunakan fitur khusus untuk kelas Console