Pemindai vs. BufferedReader

284

Sejauh yang saya tahu, dua metode paling umum membaca data berbasis karakter dari file di Java menggunakan Scanneratau BufferedReader. Saya juga tahu bahwa BufferedReadermembaca file secara efisien dengan menggunakan buffer untuk menghindari operasi disk fisik.

Pertanyaan saya adalah:

  • Apakah Scannerberkinerja sebaik BufferedReader?
  • Mengapa Anda memilih Scannerlebih BufferedReaderatau sebaliknya?
Mads Mobæk
sumber
1
Saya biasanya juga menggunakan Scanner untuk membaca dari standar dalam ('Scanner in = new Scanner (System.in)' terasa jauh lebih bersih). Tidak yakin apakah itu sebenarnya kurang efisien, tetapi karena membaca dari std in menghalangi, saya tidak bisa membayangkan efisiensi Scanner akan menjadi masalah.
dimo414

Jawaban:

201

Scannerdigunakan untuk parsing token dari isi stream sambil BufferedReaderhanya membaca stream dan tidak melakukan parsing khusus.

Bahkan Anda bisa meneruskan BufferedReaderke scannersebagai sumber karakter untuk diuraikan.

Chandra Sekar
sumber
55
BufferedReader disinkronkan dan Scanner tidak, jadi terserah Anda untuk memutuskan.
Ruben
1
Saya tahu topik ini sudah lama, tetapi saya memiliki hasil yang beragam di antara sistem operasi menggunakan BufferedReader ketika mencoba untuk menarik konten dari aliran yang disediakan oleh Proses (yaitu menangkap keluaran dari perintah eksternal). Setelah saya mengubah kode saya untuk menggunakan Pemindai sebagai gantinya, seperti dicatat dalam jawaban terpisah , semuanya mulai berlaku secara konsisten dan seperti yang diharapkan.
ewh
@ Ruben Tetapi Scannerpada akhirnya tergantung pada sesuatu yang lain untuk inputnya, yang mungkin disinkronkan.
Marquis of Lorne
189

Dalam rilis / build (b27) JDK6 terbaru saat ini, Scannerbuffer memiliki yang lebih kecil ( 1024 karakter ) dibandingkan dengan BufferedReader( 8192 karakter ), tetapi lebih dari cukup.

Untuk pilihan, gunakan Scannerjika Anda ingin mengurai file, gunakan BufferedReaderjika Anda ingin membaca file baris demi baris. Juga lihat teks pengantar dari dokumentasi API yang disebutkan sebelumnya.

  • Parsing = menafsirkan input yang diberikan sebagai token (bagian). Itu dapat memberi Anda bagian-bagian tertentu secara langsung sebagai int, string, desimal, dll. Lihat juga semua nextXxx()metode di Scannerkelas.
  • Membaca = streaming bodoh. Itu terus memberi Anda semua karakter, yang pada gilirannya Anda harus memeriksa secara manual jika Anda ingin mencocokkan atau menulis sesuatu yang berguna. Tetapi jika Anda tidak perlu melakukan itu, membaca sudah cukup.
BalusC
sumber
1
Bagus Terima kasih atas tip penyangga. Sedang mencari itu semua karena bacaan asli sangat mahal.
Achow
7
@ Asif: parsing = menafsirkan input yang diberikan sebagai token (bagian). Itu dapat memberi Anda bagian-bagian tertentu secara langsung sebagai int, string, desimal, dll. Lihat juga semua metode nextXxx () di kelas Scanner. Membaca = streaming bodoh. Itu terus memberi Anda semua karakter, yang pada gilirannya Anda harus memeriksa secara manual jika Anda ingin mencocokkan atau menulis sesuatu yang berguna. Tetapi jika Anda tidak perlu melakukan itu, membaca sudah cukup.
BalusC
@ BalusC Ok saya sudah menggunakan, readInt();readFloat (); dll. Sekarang dapatkan apa artinya parsing. dan BalusC dapat Anda berikan sedikit waktu untuk saya hanya 10 menit di ruang obrolan, saya ingin bertanya sedikit tentang buffered, bagaimana cara kerjanya.
Asif Mushtaq
Apa yang saya bungkus BufferedReaderdengan konstruktor Scanner? apakah ini ide yang bagus?
vivek
1
ScannerBuffer akan diperluas sesuai kebutuhan untuk pencocokan pola. Jadi jika Anda menginginkan buffer yang lebih besar, Anda hanya perlu memohon, misalnya findWithinHorizon("\\z", 8192), di atasnya dan sesudahnya, ia akan menggunakan buffer dengan kapasitas 8192karakter (atau seluruh file jika lebih kecil dari itu).
Holger
77

Lihat tautan ini , berikut dikutip dari sana:

BufferedReader adalah kelas sederhana yang dimaksudkan untuk membaca secara efisien dari aliran bawahan. Secara umum, setiap permintaan baca yang dibuat dari Pembaca seperti FileReader menyebabkan permintaan baca yang sesuai dibuat untuk aliran yang mendasarinya. Setiap doa read () atau readLine () dapat menyebabkan byte dibaca dari file, dikonversi menjadi karakter, dan kemudian dikembalikan, yang bisa sangat tidak efisien. Efisiensi ditingkatkan secara signifikan jika Reader dibengkokkan dalam BufferedReader.

BufferedReader disinkronkan, jadi baca operasi pada BufferedReader dapat dilakukan dengan aman dari banyak utas.

Pemindai di sisi lain memiliki lebih banyak keju yang melekat di dalamnya; ini dapat melakukan semua yang dapat dilakukan oleh BufferedReader dan pada tingkat efisiensi yang sama. Namun, selain itu Pemindai dapat mengurai aliran yang mendasarinya untuk tipe dan string primitif menggunakan ekspresi reguler. Itu juga dapat mengurangi aliran yang mendasarinya dengan pembatas pilihan Anda. Itu juga dapat melakukan pemindaian ke depan dari aliran yang mendasarinya mengabaikan pembatas!

Namun pemindai tidak aman untuk benang, itu harus disinkronkan secara eksternal.

Pilihan menggunakan BufferedReader atau Scanner tergantung pada kode yang Anda tulis, jika Anda menulis pembaca log sederhana Pembaca buffer cukup memadai. Namun jika Anda menulis Pemindai parser XML adalah pilihan yang lebih alami.

Bahkan saat membaca input, jika ingin menerima input pengguna baris per baris dan katakan hanya menambahkannya ke file, BufferedReader sudah cukup baik. Di sisi lain, jika Anda ingin menerima input pengguna sebagai perintah dengan banyak opsi, dan kemudian berniat untuk melakukan operasi yang berbeda berdasarkan perintah dan opsi yang ditentukan, Scanner akan lebih cocok.

Jomoos
sumber
"Di sisi lain, pemindai memiliki lebih banyak keju di dalamnya; ia dapat melakukan semua yang dapat dilakukan oleh BufferedReader dan pada tingkat efisiensi yang sama." Jangan setuju, BufferedReader sedikit lebih cepat dibandingkan dengan Pemindai karena Pemindai melakukan parsing data input dan BufferedReader cukup membaca urutan karakter.
Pratik
40
  1. BufferedReadermemiliki memori penyangga yang jauh lebih besar daripada Pemindai. Gunakan BufferedReaderjika Anda ingin mendapatkan string panjang dari aliran, dan gunakan Scannerjika Anda ingin menguraikan jenis token tertentu dari aliran.

  2. Scannerdapat menggunakan tokenize menggunakan pembatas khusus dan mengurai aliran ke tipe data primitif, sementara BufferedReaderhanya dapat membaca dan menyimpan String.

  3. BufferedReadersinkron sementara Scannertidak. Gunakan BufferedReaderjika Anda bekerja dengan banyak utas.

  4. Scannermenyembunyikan IOException sambil BufferedReadermelemparnya dengan segera.

Sujith PS
sumber
18

Saya sarankan untuk digunakan BufferedReaderuntuk membaca teks. Scannerbersembunyi IOExceptionsaat BufferedReadermelemparnya dengan segera.

Evgeniy
sumber
12

Perbedaan antara BufferedReader dan Pemindai adalah sebagai berikut:

  1. BufferedReader disinkronkan tetapi Pemindai tidak disinkronkan .
  2. BufferedReader aman, tetapi Pemindai tidak aman .
  3. BufferedReader memiliki memori buffer yang lebih besar tetapi Scanner memiliki memori buffer yang lebih kecil .
  4. BufferedReader lebih cepat tetapi Scanner lebih lambat dalam eksekusi .
  5. Kode untuk membaca baris dari konsol:

    Pemimpin Buffered :

     InputStreamReader isr=new InputStreamReader(System.in);
     BufferedReader br= new BufferedReader(isr);
     String st= br.readLine();

    Pemindai :

    Scanner sc= new Scanner(System.in);
    String st= sc.nextLine();
Raman Gupta
sumber
8

Berikut ini adalah perbedaan antara BufferedReader dan Scanner

  1. BufferedReader hanya membaca data tetapi pemindai juga menguraikan data.
  2. Anda hanya bisa membaca String menggunakan BufferedReader, tetapi Anda bisa membaca int, long atau float menggunakan Scanner.
  3. BufferedReader lebih tua dari Scanner, ia ada dari jdk 1.1 sementara Scanner ditambahkan pada rilis JDK 5.
  4. Ukuran Buffer dari BufferedReader besar (8KB) ​​dibandingkan dengan 1KB Scanner.
  5. BufferedReader lebih cocok untuk membaca file dengan String panjang sementara Scanner lebih cocok untuk membaca input pengguna kecil dari command prompt.
  6. BufferedReader disinkronkan tetapi Scanner tidak, yang berarti Anda tidak dapat berbagi Scanner di antara banyak utas.
  7. BufferedReader lebih cepat dari Pemindai karena tidak menghabiskan waktu untuk parsing
  8. BufferedReader sedikit lebih cepat dibandingkan dengan Scanner
  9. BufferedReader berasal dari paket java.io dan Scanner dari paket java.util berdasarkan poin-poin yang bisa kita pilih.

Terima kasih

dhS
sumber
6

Perbedaan Utama:

  1. Pemindai

  • Pemindai teks sederhana yang dapat mem-parsing tipe dan string primitif menggunakan ekspresi reguler.
  • Scanner memecah inputnya menjadi token menggunakan pola pembatas, yang secara default cocok dengan spasi putih. Token yang dihasilkan kemudian dapat dikonversi menjadi nilai dari berbagai jenis menggunakan berbagai metode selanjutnya.

Contoh

 String input = "1 fish 2 fish red fish blue fish";
 Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
 System.out.println(s.nextInt());
 System.out.println(s.nextInt());
 System.out.println(s.next());
 System.out.println(s.next());
 s.close(); 

mencetak output berikut:

 1
 2
 red
 blue 

Output yang sama dapat dihasilkan dengan kode ini, yang menggunakan ekspresi reguler untuk mem-parsing keempat token sekaligus:

 String input = "1 fish 2 fish red fish blue fish";

 Scanner s = new Scanner(input);
 s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
 MatchResult result = s.match();
 for (int i=1; i<=result.groupCount(); i++)
     System.out.println(result.group(i));
 s.close(); `


  1. Pemimpin Buffered:

    • Membaca teks dari aliran input karakter, buffering karakter untuk menyediakan pembacaan karakter, array, dan garis yang efisien.

    • Ukuran buffer dapat ditentukan, atau ukuran default dapat digunakan. Standarnya cukup besar untuk sebagian besar keperluan.

Secara umum, setiap permintaan baca yang dibuat oleh Pembaca menyebabkan permintaan baca yang sesuai dibuat dari karakter atau aliran byte yang mendasarinya. Oleh karena itu disarankan untuk membungkus BufferedReader di sekitar Pembaca mana pun yang membaca () operasinya mungkin mahal, seperti FileReaders dan InputStreamReaders. Sebagai contoh,

BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));

akan buffer input dari file yang ditentukan. Tanpa buffering, setiap permintaan read () atau readLine () dapat menyebabkan byte dibaca dari file, dikonversi menjadi karakter, dan kemudian dikembalikan, yang bisa sangat tidak efisien. Program yang menggunakan DataInputStreams untuk input tekstual dapat dilokalkan dengan mengganti setiap DataInputStream dengan BufferedReader yang sesuai.

Sumber: Tautan

Shiva Nandam Sirmarigari
sumber
3

Ada berbagai cara mengambil input di java seperti:

1) BufferedReader 2) Scanner 3) Argumen Baris Perintah

BufferedReader Baca teks dari aliran input karakter, buffering karakter untuk menyediakan pembacaan karakter, array, dan garis yang efisien.

Di mana Pemindai adalah pemindai teks sederhana yang dapat mem-parsing tipe dan string primitif menggunakan ekspresi reguler.

jika Anda menulis pembaca log sederhana, Buffered reader sudah memadai. jika Anda menulis Pemindai parser XML adalah pilihan yang lebih alami.

Untuk informasi lebih lanjut silakan merujuk:

http://java.meritcampus.com/t/240/Bufferedreader?tc=mm69

manisha mulchandani
sumber
1

Jawaban di bawah ini diambil dari Membaca dari Konsol: JAVA Scanner vs BufferedReader

Saat membaca input dari konsol, ada dua opsi yang ada untuk mencapai itu. Pertama menggunakan Scanner, menggunakan yang lain BufferedReader. Keduanya memiliki karakteristik berbeda. Itu artinya perbedaan cara menggunakannya.

Scanner memperlakukan input yang diberikan sebagai token. BufferedReader baru saja membaca baris demi baris yang diberikan input sebagai string. Pemindai itu sendiri menyediakan kemampuan penguraian seperti nextInt (), nextFloat ().

Tapi, apa perbedaan orang lain?

  • Scanner memperlakukan input yang diberikan sebagai token. BufferedReader sebagai stream line / String
  • Scanner tokenized diberi input menggunakan regex. Menggunakan BufferedReader harus menulis kode tambahan
  • BufferedReader lebih cepat dari Scanner * no. 2
  • Pemindai tidak disinkronkan, BufferedReader disinkronkan

Pemindai hadir sejak JDK versi 1.5 lebih tinggi.

Kapan sebaiknya menggunakan Scanner, atau Buffered Reader?

Lihatlah perbedaan utama di antara keduanya, satu menggunakan tokenized, yang lain menggunakan garis aliran. Saat Anda membutuhkan kemampuan parsing, gunakan Pemindai sebagai gantinya. Tapi, saya lebih nyaman dengan BufferedReader. Ketika Anda perlu membaca dari File, gunakan BufferedReader, karena itu menggunakan buffer ketika membaca file. Atau Anda dapat menggunakan BufferedReader sebagai input ke Pemindai.

KNU
sumber
0
  1. BufferedReader mungkin akan memberikan Anda kinerja yang lebih baik (karena Scanner didasarkan pada InputStreamReader, lihat sumber). up, untuk membaca dari file menggunakan nio. Ketika saya menguji kinerja nio terhadap kinerja BufferedReader untuk file besar, nio menunjukkan kinerja yang sedikit lebih baik.
  2. Untuk membaca dari file coba Apache Commons IO.
Roma
sumber
0

Saya lebih suka Scannerkarena itu tidak membuang pengecualian diperiksa dan karena itu penggunaannya menghasilkan kode yang lebih ramping.

ini adalah desainku
sumber