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?
BufferedWriter ist effizienter, wenn Sie
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.
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.
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.
Aus der Java-API-Spezifikation:
Komfortklasse zum Schreiben von Zeichendateien. Die Konstruktoren dieser Klasse gehen davon aus, dass die Standardzeichencodierung und die Standardbytepuffergröße akzeptabel sind.
Schreiben Sie Text in einen Zeichenausgabestrom, indem Sie Zeichen puffern, um das effiziente Schreiben von einzelnen Zeichen, Arrays und Strings zu ermöglichen.
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.