it-swarm.com.de

Java-Unterschied zwischen FileWriter und BufferedWriter

Was ist der Unterschied zwischen diesen? Ich lerne gerade Java ATM, aber es scheint, als könnte ich auf beide Arten in eine Datei schreiben, d. H. (Ich habe den try-catch-Block hier nicht kopiert.)

FileWriter file = new FileWriter("foo.txt");
file.write("foobar");
file.close();

und

FileWriter file = new FileWriter("foo.txt");
BufferedWriter bf = new BufferedWriter(file);
bf.write("foobar");
bf.close();

Ich verstehe zunächst das Konzept der Pufferung der Daten. Bedeutet dies, dass das erste Beispiel die Zeichen nacheinander schreibt und das zweite erste die Daten in den Speicher puffert und einmal schreibt?

63
Opi

BufferedWriter ist effizienter, wenn Sie

  • habe mehrere Schreibvorgänge zwischen Flush/Close
  • die Schreibvorgänge sind klein im Vergleich zur Puffergröße.

In Ihrem Beispiel haben Sie nur einen einzigen Schreibvorgang, so dass der BufferedWriter nur Overhead hinzufügt, den Sie nicht benötigen.

das heißt, das erste Beispiel schreibt die Zeichen einzeln und das zweite erste puffert es in den Speicher und schreibt es einmal

In beiden Fällen wird die Zeichenfolge gleichzeitig geschrieben.

Wenn Sie nur FileWriter verwenden, werden Ihre Schreibaufrufe (String) aufgerufen

 public void write(String str, int off, int len) 
        // some code
        str.getChars(off, (off + len), cbuf, 0);
        write(cbuf, 0, len);
 }

Dies macht einen Systemaufruf pro Aufruf von write (String).


Wo BufferedWriter die Effizienz verbessert, liegt in mehreren kleinen Schreibvorgängen.

for(int i = 0; i < 100; i++) {
    writer.write("foorbar");
    writer.write(NEW_LINE);
}
writer.close();

Ohne BufferedWriter können 200 Systemaufrufe (2 * 100) und Schreibvorgänge auf die Festplatte erfolgen, was ineffizient ist. Mit einem BufferedWriter können diese alle zusammen gepuffert werden. Da die Standardpuffergröße 8192 Zeichen beträgt, werden nur noch 1 Systemaufruf geschrieben.

79
Peter Lawrey

Du hast recht. So sieht write() Methode von BufferedWriter aus:

public void write(int c) throws IOException {
    synchronized (lock) {
        ensureOpen();
        if (nextChar >= nChars)
            flushBuffer();
        cb[nextChar++] = (char) c;
    }
}

Wie Sie sehen, wird in der Tat geprüft, ob der Puffer voll ist (if (nextChar >= nChars)), und der Puffer wird geleert. Dann fügt er dem Puffer (cb[nextChar++] = (char) c;) ein neues Zeichen hinzu.

8
AlexR

BufferedWriter ist effizienter. Es erspart kleine Schreibvorgänge und schreibt in einem größeren Block, wenn der Speicher mir richtig hilft. Wenn Sie viele kleine Schreibvorgänge ausführen, würde ich BufferedWriter verwenden. Das Aufrufen von Schreibaufrufen an das Betriebssystem ist langsam, daher ist es normalerweise wünschenswert, so wenig Schreibvorgänge wie möglich zu haben.

4
RNJ

Aus der Java-API-Spezifikation:

FileWriter

Komfortklasse zum Schreiben von Zeichendateien. Die Konstruktoren dieser Klasse gehen davon aus, dass die Standardzeichencodierung und die Standardbytepuffergröße akzeptabel sind.

BufferedWriter

Schreiben Sie Text in einen Zeichenausgabestrom, indem Sie Zeichen puffern, um das effiziente Schreiben von einzelnen Zeichen, Arrays und Strings zu ermöglichen.

0
Magicode

http://docs.Oracle.com/javase/1.5.0/docs/api/Java/io/BufferedWriter.html

Im Allgemeinen sendet ein Writer seine Ausgabe sofort an den zugrunde liegenden Zeichen- oder Byte-Stream. Wenn die Aufforderung zur Ausgabe von Aufforderungen nicht erforderlich ist, ist es ratsam, einen BufferedWriter um einen Writer zu wickeln, dessen write () - Vorgänge möglicherweise kostspielig sind, beispielsweise FileWriters und OutputStreamWriters. Zum Beispiel,

PrintWriter out = neuer PrintWriter (neuer BufferedWriter (neuer 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 umgewandelt werden, die sofort in die Datei geschrieben werden, was sehr ineffizient sein kann.

0
Ilia Nedoluzhko