2014-11-11 11 views
5

Ich lese diese Frage Using flush() before close(), und die angenommene Antwort ist dies nur bedeutet, dass Sie das Muster folgen.Müssen wir heute flush() kurz vor close() aufrufen?

Genau wie BufferedWriter#close() oder FilterOutputStream.#close(), wenn alle gepufferten Strom/Writer wird seine flush() nennen, wenn wir close() anrufen und wenn wir (die Entwickler und der Entwickler, die den Code überprüfen wird) alle das wissen, haben wir wirklich noch brauchen Dies? Wenn ja, was wird der Grund sein?

+0

IMO, Sie nicht, aber das bedeutet nicht, dass es eine gute Idee ist :-) Wenn Sie von Writer oder OutputStream-Implementierung wechseln, können Sie unerwartete Verhalten beenden, wenn Sie diejenigen, die es brauchen nicht flush. Sie können argumentieren, dass einige nutzlose flush() es ist ein schlechtes JVM Design, dann meine Antwort ist "vielleicht" :-) Eine andere Sache, die wir erforschen können, ist Rückwärtskompatibilität, wenn frühere Versionen der JVM auch ohne die gut funktionieren spülen(). – Leo

+0

Worum genau fragen Sie, was nicht in der Frage enthalten ist, auf die Sie verlinken? – jarnbjo

+0

@jarnbjo, ich muss nur wissen, ob dies nur eine Leerlaufarbeit ist, außer dass dies nur eine Regel explizit folgt? – Jaskey

Antwort

2

Wie der Javadoc sagt, brauchen Sie nicht , um sich zu spülen. Aber es ist immer noch gut zu tun, in Anbetracht Ihrer Leser und gesunden Menschenverstand.

Nur wenige Experten kennen den Javadoc auswendig. Ich würde nicht sicher wissen, ob der Stream gespült wird oder nicht, ohne nachzusehen, und ich bin wahrscheinlich nicht allein. Wenn Sie den expliziten Aufruf flush() aufrufen, wird dies deutlich, , und der Code wird dadurch leichter lesbar.

Außerdem bedeutet der Methodenname close() nichts über Spülen. Es ist von der Closeable Schnittstelle, und natürlich, sagt nichts über Spülen. Wenn Sie einen gepufferten Ausgabestream vor dem Schließen nicht leeren, trotz des Wunsches, es zu leeren, Sie verlassen sich auf Annahmen, die wahr sein können oder nicht. Es würde Ihre Implementierung schwächen.

Alle Annahmen, die Sie treffen, sollten Sie irgendwie an zukünftige Betreuer weitergeben. Eine Möglichkeit, dies zu tun ist durch einen Kommentar zu verlassen:

// no need to flush() manually, close() will do it automatically 

Wenn Sie diesen Kommentar nicht verlassen, Zukunft Maintainer müssen auch die javadoc Nachschlag kann, wie ich, wenn sie don‘ Ich habe es auswendig gelernt. Aber warum sollten Sie einen solchen Kommentar schreiben, wenn es einfacher und besser ist, ihn einfach selbst zu nennen und damit fertig zu sein.

Kurz gesagt, Spülen zuerst vor dem Schließen folgt einfach einer guten Logik. Keine Notwendigkeit für Annahmen und zweite Vermutungen, und keine Notwendigkeit, Ihre Leser zum Nachdenken zu bringen.

+0

Zwei weitere Dinge zu klären.1.Nur gepufferter Stream benötigt flush() vor dem Schließen() 2.Jeder Stream in Java. io wird keine Nebenwirkung haben, wenn ich() ohne flush() schließe. Ist es richtig? – Jaskey

+0

1. Ja, Spülen ist ein Konzept für gepufferte Ausgaben. Siehe auch [Flushable] (https://docs.oracle.com/javase/7/docs/api/java/io/Flusshable.html) 2. Es gibt einige Streams in 'java.io'. Ich müsste alle durchgehen, um das zu überprüfen, und ich sehe einfach keinen Sinn darin. Auf der anderen Seite fügte ich einen weiteren Grund hinzu, um zu fluten, sehe meine aktualisierte Antwort. – janos

-1

Für die Ausgabe ist es wichtig, dass wir flush() und close() aufrufen, da gepufferte Daten verloren gehen können, wie in der ersten Antwort here erläutert. Wenn die Ausgabe Ihres Programms klein ist, wird Ihr Schreiber schnell fertig, es wird nach meiner Erfahrung keinen großen Unterschied zu Close() und Flush() machen.

Für die Eingabe ist es egal, ob wir close() nicht aufrufen, bevor das System beendet wird.

+0

Aber die ' close() 'bereits flush für uns, so ist dies meine Frage, warum müssen wir manuell vor dem Schließen manuell spülen() – Jaskey

+0

Ich hatte das nie zuvor tun, nicht sicher, warum Sie würden. –

+1

Hier klicken http://StackOverflow.com/Questions/9858495/using-flush-before-close – Jaskey

Verwandte Themen