Unterschied zwischen java.io.PrintWriter und java.io.BufferedWriter?

94

Bitte schauen Sie sich den folgenden Code an:

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

Was ist der Unterschied zwischen diesen beiden Methoden?

Wann sollten wir PrintWriter über BufferedWriter verwenden?

i2ijeya
quelle

Antworten:

61

Die API-Referenz für BufferedWriter und PrintWriter beschreibt die Unterschiede.

Der Hauptgrund für die Verwendung von PrintWriter ist der Zugriff auf printXXX-Methoden wie println (). Sie können im Wesentlichen einen PrintWriter verwenden, um in eine Datei zu schreiben, genau wie Sie System.out verwenden würden, um in die Konsole zu schreiben.

Ein BufferedWriter ist eine effiziente Methode zum Schreiben in eine Datei (oder etwas anderes), da er die Zeichen im Java-Speicher puffert, bevor er (wahrscheinlich abhängig von der Implementierung) in C abgelegt wird, um in die Datei zu schreiben.

Es gibt kein Konzept wie einen "PrintReader". Der nächstgelegene ist wahrscheinlich java.util.Scanner .

TofuBeer
quelle
4
@TritonMan muss irgendwann mit dem Betriebssystem interagieren, was bedeutet, dass Sie Java verlassen müssen.
TofuBeer
89

PrintWritergibt mehr Methoden ( println), aber der wichtigste (und besorgniserregendste) Unterschied ist, dass es Ausnahmen verschluckt .

Sie können checkErrorspäter anrufen, um zu sehen, ob Fehler aufgetreten sind. In der Regel werden Sie diese jedoch beispielsweise PrintWriterzum Schreiben auf die Konsole verwenden - oder in "Quick 'n Dirty" -Apps, in denen Sie nicht durch Ausnahmen gestört werden möchten (und wo langfristige Zuverlässigkeit ist kein Problem).

Ich bin mir nicht sicher , warum die „extra Formatierung Fähigkeiten“ und „nicht schlucken Ausnahmen“ Aspekte werden in die gleiche Klasse gebündelt - Formatierung ist offensichtlich nützlich in vielen Orten , an denen Sie keine Ausnahmen geschluckt werden sollen. Es wäre schön zu sehen, dass BufferedWriterich irgendwann die gleichen Fähigkeiten bekomme ...

Jon Skeet
quelle
@WindyFields: Nein, PrintStreamist ein OutputStream. PrintWriterist ein Writer.
Jon Skeet
Vielen Dank. "Es schluckt Ausnahmen." Meinen Sie damit, dass PrintWriter keine aktivierten Ausnahmen auslöst? Wie wäre es mit ungeprüften Ausnahmen?
@ Ben: Ich wurde speziell reden IOException, dass jeder andere IO Abstraktion ( Reader, Writerusw.) erklärt , dass seine Methoden werfen , IOExceptionwenn etwas schief geht - PrintWriternicht der Fall ist.
Jon Skeet
8

Wie in TofuBeers Antwort gesagt, haben beide ihre Spezialitäten. Um den vollen Nutzen von PrintWriter (oder einem anderen Writer) zu nutzen, aber auch gepuffertes Schreiben zu verwenden, können Sie den BufferedWriter wie folgt mit dem erforderlichen umschließen:

PrintWriter writer = new PrintWriter(
                         new BufferedWriter (
                             new FileWriter("somFile.txt")));
Kai Huppmann
quelle
2
Erinnern Sie sich an @Jons Kommentar, dass der PrintWriter die Ausnahmen verschluckt. checkError sollte aufgerufen werden.
MadMurf
1
Ich liebte die königlichen Tenenbaums
Ogen
4
Zumindest in der aktuellen openJDK 8-Implementierung (und wahrscheinlich älteren Versionen) wird PrinterWriterbereits eine erstellt BufferedWriter.
Nimrodm
7

PrintWriter macht nur die Druckmethoden auf jedem Writer im Zeichenmodus verfügbar.

BufferedWriter ist nach seinen gepufferten Methoden effizienter als. Abhängig von Ihrer Systemplattform wird eine newLine () -Methode verwendet, um Textdateien korrekt zu bearbeiten.

Der BufferedReader ermöglicht das Lesen eines Textes aus einer Datei mit in Zeichen konvertierten Bytes. Es ermöglicht das zeilenweise Lesen.

Es gibt keinen PrintReader. Sie müssen eine andere Reader-Implementierung entsprechend dem Format Ihrer Eingabe auswählen.

Lioda
quelle
3

PrintWriter ist der am besten verbesserte Writer zum Schreiben von Zeichendaten in eine Datei.

Der Hauptvorteil von PrintWriter gegenüber FileWriter und BufferedWriter ist:

  1. PrintWriter kann direkt mit der Datei und auch über ein Writer-Objekt kommunizieren.

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

(oder)

FileWriter filewriter = new FileWriter("blah.txt");
PrintWriter printwiter = new PrintWriter(filewriter);
  1. Wir können jede Art von primitiven Daten direkt in die Datei schreiben (da wir zusätzliche überladene Versionen der PrintWriter-Methoden haben, dh print () und println ()).

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

Syed Maqsood
quelle
2

Im Allgemeinen sendet ein Writer seine Ausgabe sofort an das zugrunde liegende Zeichen oder den Bytestream. Sofern keine sofortige Ausgabe erforderlich ist, ist es ratsam, einen BufferedWriter um einen Writer zu wickeln, dessen write () -Operationen kostspielig sein können, z. B. FileWriters und OutputStreamWriters. Beispielsweise,

Hinweis: Der Textinhalt in den Codeblöcken wird automatisch in Zeilenumbrüche umgewandelt

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

puffert die Ausgabe des PrintWriter in die Datei. Ohne Pufferung würde jeder Aufruf einer print () -Methode dazu führen, dass Zeichen in Bytes konvertiert werden, die dann sofort in die Datei geschrieben werden, was sehr ineffizient sein kann.

Rohit Goyal
quelle
0

BufferedWriter - Schreibt Text in einen Ausgabezeichenstrom und puffert Zeichen aus einem Zeichenstrom. PrintWriter - Druckt formatierte Darstellungen von Objekten in einen Textausgabestream.

Vidyut Singhai
quelle
-1

Ich denke, dass der Grund für die Verwendung von PrintWriter bereits oben erwähnt wurde, aber einer der wichtigen Gründe ist, dass Sie ein Dateiobjekt direkt an den PrintWriter-Konstruktor übergeben, was die Verwendung vereinfacht.

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