Was ist der Zweck von flush () in Java-Streams?


120

In Java wird die flush()Methode in Streams verwendet. Aber ich verstehe nicht, wozu diese Methode eigentlich dient.

fin.flush();

Sag mir ein paar Vorschläge.

Antworten:


100

Aus den Dokumenten der flushMethode:

Leert den Ausgabestream und erzwingt das Ausschreiben aller gepufferten Ausgabebytes. Der allgemeine Vertrag von Flush ist, dass das Aufrufen ein Hinweis darauf ist, dass, wenn zuvor geschriebene Bytes durch die Implementierung des Ausgabestreams gepuffert wurden, diese Bytes sofort an ihr beabsichtigtes Ziel geschrieben werden sollten.

Die Pufferung erfolgt hauptsächlich zur Verbesserung der E / A-Leistung. Weitere Informationen hierzu finden Sie in diesem Artikel: Optimieren der Java-E / A-Leistung .



+1 Danke. Ich konnte nicht herausfinden, warum meine Bytes nicht gesendet wurden, und das liegt daran, dass ich meine Puffer leeren musste.
Rayryeng

3
Wird die Flush-Methode nur bei gepufferten Streams verwendet? Gibt es einen Vorteil bei der Verwendung mit anderen Streams (z. B. Outputstream)?
Tnishada

Vielleicht sollte das Wort "Flush" nicht in seiner Definition sein. Rekursive Definitionen sind eine schlechte Idee, um neue Dinge zu verstehen. Mir ist bekannt, dass Sie die Definition nicht geschrieben haben.
Jonathan Komar

27

Wenn wir einen Befehl erteilen, werden die Streams dieses Befehls in dem Speicher gespeichert, der als Puffer (ein temporärer Speicherort) auf unserem Computer bezeichnet wird. Wenn der gesamte temporäre Speicherplatz voll ist, verwenden wir flush (), das alle Datenströme löscht und vollständig ausführt und neuen Streams im temporären Speicherort des Puffers neuen Speicherplatz gibt. -Hoffentlich wirst du verstehen


1
Nur im Fall BufferedOutputStream, BufferedWriter, ObjectOutputStream,und die PrintXXXKlassen. Die flush()Methode eines anderen Streams oder Writertut nichts.
Marquis von Lorne

@EJP Gibt es Verweise auf die Sicherung Ihrer Aussagen? Es wäre hilfreich für uns Neulinge :)
mr5

1
@ mr5 Es ist das Plakat, das seine Aussagen stützen muss, nicht ich, aber alles, was ich gesagt habe, ist im Javadoc
Marquis von Lorne am

Ein flush()explizites Aufrufen ist für a nicht erforderlich BufferedWriter, solange Sie close()der Autor sind. close()führt selbst einen Flush aus.
Yossarian42

Beachten Sie close()Aufrufe flush(), sodass das Aufrufen beider Anrufe bei Verwendung FileWriterohne Puffer redundant ist .
Yossarian42

26

Wenn Sie Daten in einen Stream schreiben, werden diese nicht sofort geschrieben und gepuffert. Verwenden flush()Sie diese Option, wenn Sie sicherstellen müssen, dass alle Ihre Daten aus dem Puffer geschrieben sind.

Wir müssen sicherstellen, dass alle Schreibvorgänge abgeschlossen sind, bevor wir den Stream schließen. Deshalb flush()wird er in Datei- / gepufferten Writern aufgerufen close().

Wenn Sie jedoch festlegen müssen, dass alle Ihre Schreibvorgänge jederzeit gespeichert werden, bevor Sie den Stream schließen, verwenden Sie flush().


8
Das Aufrufen von Flush kurz vor dem Schließen ist überflüssig, oder? Es ist das gleiche wie einfach anrufen.
John Henckel

2
@ BimanTripathy Das kann ich mit 100% iger Sicherheit sagen. Es wird vom Javadoc von FilterOutputStreamund garantiert FilterWriter.
Marquis von Lorne

7

Wenn der Puffer voll ist, werden alle darauf gepufferten Zeichenfolgen auf der Festplatte gespeichert. Puffer werden verwendet, um Big Deals zu vermeiden! und Overhead.

In der BufferedWriter-Klasse, die in Java-Bibliotheken platziert ist, gibt es eine Zeile wie:

private static int defaultCharBufferSize = 8192;

Wenn Sie Daten senden möchten, bevor der Puffer voll ist, haben Sie die Kontrolle. Spülen Sie es einfach. Aufrufe von writer.flush () sagen: "Senden Sie jetzt alles, was sich im Puffer befindet!"

Nachschlagewerk: https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208

Seiten: 453


4

Auf Streams wird häufig von Threads zugegriffen, die ihren Inhalt regelmäßig leeren und ihn beispielsweise auf dem Bildschirm anzeigen, an einen Socket senden oder in eine Datei schreiben. Dies erfolgt aus Leistungsgründen. Das Leeren eines Ausgabestreams bedeutet, dass Sie anhalten, warten möchten, bis der Inhalt des Streams vollständig an sein Ziel übertragen wurde, und dann die Ausführung mit leerem Stream und gesendetem Inhalt fortsetzen möchten.


5
Das ist Fantasie. Auf Streams wird von keinen magischen Threads zugegriffen. nur die von der Anwendung erstellten.
Marquis von Lorne

3

Bei Leistungsproblemen müssen die ersten Daten in den Puffer geschrieben werden. Wenn der Puffer voll ist, werden Daten in die Ausgabe geschrieben (Datei, Konsole usw.). Wenn der Puffer teilweise gefüllt ist und Sie ihn an die Ausgabe (Datei, Konsole) senden möchten, müssen Sie die Methode flush () manuell aufrufen, um einen teilweise gefüllten Puffer in die Ausgabe (Datei, Konsole) zu schreiben.


Das ist nicht wahr. FileOutputStream.flush () ist ein leeres No-Op.
Vertuso
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.