Java.io.PrintWriter ve java.io.BufferedWriter arasındaki fark nedir?


97

Lütfen aşağıdaki kodu inceleyin:

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

Bu iki yöntem arasındaki fark nedir?

BufferedWriter yerine PrintWriter'ı ne zaman kullanmalıyız?

Yanıtlar:


63

BufferedWriter ve PrintWriter için API referansı farklılıkları detaylandırır.

PrintWriter'ı kullanmanın ana nedeni, println () gibi printXXX yöntemlerine erişim sağlamaktır. Konsola yazmak için System.out'u kullanır gibi bir dosyaya yazmak için bir PrintWriter kullanabilirsiniz.

BufferedWriter, bir dosyaya (veya başka herhangi bir şeye) yazmak için etkili bir yoldur, çünkü Java belleğindeki karakterleri (muhtemelen uygulamaya bağlı olarak) dosyaya yazmak için C'ye bırakmadan önce tamponlayacaktır.

"PrintReader" diye bir kavram yoktur; alacağınız en yakın şey muhtemelen java.util.Scanner'dır .


4
@TritonMan bir noktada işletim sistemi ile etkileşime girmesi gerekiyor, bu da Java'nın dışına çıkmak anlamına geliyor.
TofuBeer

ancak PrintWriter da arabelleğe alınır, değil mi? Bu yüzden, cevabınızın önerebileceği gibi, aralarında gerçek bir fark yok
Satır

PrintWriter arabelleğe alınır, ancak fark, yazıcı yazıcısının sahip olduğu yöntemlerdir. Hiçbir şeyi ima ettiğimi sanmıyorum ...
TofuBeer

BufferedWriter hakkında yazdıklarınız - PrintWriter için de doğru mu, değil mi? Bu cevabın farklılıklar
Satır

90

PrintWriterdaha fazla yöntem verir ( println), ancak farkında olunması gereken en önemli (ve endişe verici) fark, istisnaları yutmasıdır .

checkErrorHerhangi bir hata olup olmadığını görmek için daha sonra arayabilirsin , ancak genellikle PrintWriterkonsola yazmak gibi şeyler için veya istisnalar nedeniyle rahatsız edilmek istemediğiniz "hızlı 'n kirli" uygulamalarda (ve nerede uzun vadeli güvenilirlik sorun değildir).

Emin değilim neden "ekstra biçimlendirme yetenekleri" ve "do not kırlangıç istisnalar" yönler aynı sınıfta bindirildiğini - biçimlendirme birçok yerde açıkça yararlıdır yok istisnalar yuttu olmak istiyorum. Bir BufferedWriternoktada aynı yetenekleri aldığını görmek güzel olurdu ...


@WindyFields: Hayır, PrintStreambir OutputStream. PrintWriterbir Writer.
Jon Skeet

Teşekkürler. "istisnaları yutar." PrintWriter'ın kontrol edilen istisnaları yükseltmediğini mi söylüyorsunuz? Kontrol edilmeyen istisnalara ne dersiniz?

1
@Ben: Özellikle hakkında konuşuyordum IOException, çünkü diğer her IO soyutlaması ( Reader, Writervb.), Yöntemlerinin bir IOExceptionşeyler ters giderse attığını bildiriyor - PrintWriterdeğil.
Jon Skeet

8

TofuBeer'in cevabında söylendiği gibi, her ikisinin de kendine has özellikleri vardır. PrintWriter'dan (veya başka herhangi bir yazardan) tam olarak yararlanmak, ancak aynı zamanda arabelleğe alınmış yazıyı kullanmak için BufferedWriter'ı aşağıdaki gibi gerekli olanla sarabilirsiniz:

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));

2
@Jons'u hatırlamak, PrintWriter'ın istisnaları yutacağını söylüyor. checkError çağrılmalıdır.
MadMurf

4
En azından mevcut openJDK 8 uygulamasında (ve muhtemelen daha eski sürümlerde), PrinterWriterzaten bir BufferedWriter.
nimrodm

7

PrintWriter, herhangi bir Writer üzerindeki yazdırma yöntemlerini karakter modunda gösterir.

BufferedWriter, tamponlu yöntemlerine göre daha verimlidir. Ve metin dosyalarını doğru şekilde işlemek için sistem platformunuza bağlı olarak bir newLine () yöntemi ile birlikte gelir.

BufferedReader, karakterlere dönüştürülmüş baytlarla dosyadan bir metin okumaya izin verir. Satır satır okumaya izin verir.

PrintReader yoktur, girişinizin formatına göre başka bir Reader uygulaması seçmeniz gerekir.


3

PrintWriter , Karakter verilerini bir dosyaya yazmak için en gelişmiş Yazıcıdır .

PrintWriter'ın FileWriter ve BufferedWriter'a göre ana avantajı şudur:

  1. PrintWriter dosya ile doğrudan iletişim kurabilir ve ayrıca bazı Writer nesneleri aracılığıyla da iletişim kurabilir.

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

(veya)

FileWriter filewriter = new FileWriter("blah.txt");
PrintWriter printwiter = new PrintWriter(filewriter);
  1. Her tür İlkel veriyi doğrudan dosyaya yazabiliriz (çünkü PrintWriter yöntemlerinin fazladan yüklenmiş sürümlerine sahibiz, örneğin, print () ve println ()).

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


2

Genel olarak, bir Yazar, çıktısını hemen temeldeki karaktere veya bayt akışına gönderir. Komut istemi çıktısı gerekmedikçe, FileWriters ve OutputStreamWriters gibi write () işlemleri maliyetli olabilecek herhangi bir Writer'ın etrafına BufferedWriter'ı sarmanız önerilir. Örneğin,

Not: Kod bloklarındaki metin içeriği otomatik olarak sözcük kaydırılır

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

PrintWriter'ın çıktısını dosyaya tamponlayacaktır. Arabelleğe alma olmadan, bir print () yönteminin her çağrılması, karakterlerin baytlara dönüştürülmesine ve daha sonra dosyaya hemen yazılmasına neden olur ve bu da çok verimsiz olabilir.


0

BufferedWriter - Bir karakter akışından karakterleri arabelleğe alarak bir çıktı karakter akışına metin yazar. PrintWriter - Nesnelerin biçimlendirilmiş temsillerini bir metin çıktı akışına yazdırır.


-1

PrintWriter kullanmanın arkasındaki nedenin yukarıda belirtildiğini düşünüyorum, ancak önemli nedenlerden biri, bir dosya nesnesini doğrudan PrintWriter yapıcısına geçirmeniz ve bu da onu kullanmayı kolaylaştırmasıdır.

File file=new File(“newfile.txt”);
PrintWriter pw=new PrintWriter(file);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.