Perbedaan antara java.io.PrintWriter dan java.io.BufferedWriter?

94

Silakan lihat kode di bawah ini:

// A.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
PrintWriter printWriter = new PrintWriter(fileWriter);

// B.class
File file = new File("blah.txt");
FileWriter fileWriter = new FileWriter(file);
BufferedWriter bWriter = new BufferedWriter(fileWriter);

Apa perbedaan antara kedua metode ini?

Kapan kita harus menggunakan PrintWriter melalui BufferedWriter?

i2ijeya
sumber

Jawaban:

61

Referensi API untuk BufferedWriter dan PrintWriter merinci perbedaannya.

Alasan utama menggunakan PrintWriter adalah untuk mendapatkan akses ke metode printXXX seperti println (). Pada dasarnya Anda dapat menggunakan PrintWriter untuk menulis ke file seperti Anda menggunakan System.out untuk menulis ke konsol.

BufferedWriter adalah cara yang efisien untuk menulis ke file (atau apa pun), karena ini akan menyangga karakter dalam memori Java sebelum (mungkin, tergantung pada implementasinya) turun ke C untuk melakukan penulisan ke file.

Tidak ada konsep seperti "PrintReader"; yang terdekat mungkin adalah java.util.Scanner .

TofuBeer
sumber
4
@TritonMan di beberapa titik perlu berinteraksi dengan OS, yang berarti melangkah keluar dari Java.
TofuBeer
89

PrintWritermemberikan lebih banyak metode ( println), tetapi perbedaan yang paling penting (dan mengkhawatirkan) untuk diperhatikan adalah bahwa ia menelan pengecualian .

Anda dapat menelepon checkErrornanti untuk melihat apakah ada kesalahan yang telah terjadi, tetapi biasanya Anda akan menggunakan PrintWriteruntuk hal-hal seperti menulis ke konsol - atau di aplikasi "cepat 'n kotor" di mana Anda tidak ingin diganggu oleh pengecualian (dan di mana keandalan jangka panjang bukanlah masalah).

Saya tidak yakin mengapa aspek "kemampuan pemformatan ekstra" dan "jangan menelan pengecualian" digabungkan ke dalam kelas yang sama - pemformatan jelas berguna di banyak tempat di mana Anda tidak ingin pengecualian ditelan. Akan menyenangkan melihat BufferedWritermendapatkan kemampuan yang sama di beberapa titik ...

Jon Skeet
sumber
@WindyFields: Tidak, PrintStreamadalah OutputStream. PrintWriteradalah a Writer.
Jon Skeet
Terima kasih. "itu menelan pengecualian." Apakah maksud Anda PrintWriter tidak memunculkan pengecualian yang dicentang? Bagaimana dengan excepitons yang tidak diperiksa?
@ Ben: Saya secara khusus berbicara tentang IOException, di mana setiap abstraksi IO lainnya ( Reader, Writerdll) menyatakan bahwa metodenya membuang IOExceptionjika ada yang salah - PrintWritertidak.
Jon Skeet
8

Seperti yang dikatakan dalam jawaban TofuBeer, keduanya memiliki spesialisasi. Untuk mengambil keuntungan penuh dari PrintWriter (atau penulis lain) tetapi juga menggunakan penulisan buffer, Anda dapat membungkus BufferedWriter dengan yang dibutuhkan seperti ini:

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));
Kai Huppmann
sumber
2
Mengingat komentar @Jons bahwa PrintWriter akan menelan pengecualian. checkError harus dipanggil.
MadMurf
1
Saya menyukai tenenbaum kerajaan
Ogen
4
Setidaknya dalam implementasi openJDK 8 saat ini (dan mungkin versi yang lebih lama), PrinterWritersudah membuat file BufferedWriter.
nimrodm
7

PrintWriter hanya mengekspos metode cetak pada Writer manapun dalam mode karakter.

BufferedWriter lebih efisien daripada, menurut metode buffernya. Dan itu datang dengan metode newLine (), tergantung dari platform sistem Anda, untuk memanipulasi file teks dengan benar.

BufferedReader mengizinkan untuk membaca teks dari file, dengan byte yang dikonversi dalam karakter. Ini memungkinkan untuk membaca baris demi baris.

Tidak ada PrintReader, Anda harus memilih implementasi Reader lain sesuai dengan format masukan Anda.

Lioda
sumber
3

PrintWriter adalah Writer yang paling canggih untuk menulis data Karakter ke file.

Keuntungan utama PrintWriter dibandingkan FileWriter dan BufferedWriter adalah:

  1. PrintWriter dapat berkomunikasi langsung dengan file, dan juga dapat berkomunikasi melalui beberapa objek Writer.

PrintWriter printwriter = new PrintWriter("blah.txt");

(atau)

FileWriter filewriter = new FileWriter("blah.txt");
PrintWriter printwiter = new PrintWriter(filewriter);
  1. Kita dapat menulis semua jenis data Primitive langsung ke file (karena kita memiliki versi metode PrintWriter tambahan yang kelebihan beban yaitu, print () dan println ()).

    printwriter.print(65); //65
    bufferedwriter.write(65); //A
    printwriter.println(true); //true

Syed Maqsood
sumber
2

Secara umum, Writer mengirimkan outputnya segera ke aliran byte atau karakter yang mendasarinya. Kecuali jika output prompt diperlukan, disarankan untuk menggabungkan BufferedWriter di sekitar Writer yang operasi write () mungkin mahal, seperti FileWriters dan OutputStreamWriters. Sebagai contoh,

Catatan: Konten teks dalam blok kode secara otomatis dibungkus kata

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));

akan menyangga keluaran PrintWriter ke file. Tanpa buffering, setiap pemanggilan metode print () akan menyebabkan karakter diubah menjadi byte yang kemudian akan langsung ditulis ke file, yang bisa sangat tidak efisien.

Rohit Goyal
sumber
0

BufferedWriter - Menulis teks ke aliran karakter keluaran, menyangga karakter dari aliran karakter. PrintWriter - Mencetak representasi objek yang diformat ke aliran output teks.

Vidyut Singhai
sumber
-1

Saya pikir alasan di balik menggunakan PrintWriter sudah disebutkan di atas tetapi salah satu alasan penting adalah Anda mengirimkan objek file langsung ke konstruktor PrintWriter yang membuatnya mudah untuk menggunakannya.

File file=new File(“newfile.txt”);
PrintWriter pw=new PrintWriter(file);
AjayLohani
sumber