2014-03-03 7 views
6

Im folgende SzenarioWarum muss der Ausgabepuffer gelöscht werden, wenn er gerade erstellt wurde?

ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); 
output.flush(); 
// Do stuff with it 

Warum ist es immer notwendig, den Puffer nach der Erstellung zu spülen?
Ich sehe dies die ganze Zeit und ich verstehe nicht wirklich was muss gespült werden. Ich erwarte, dass neu erstellte Variablen leer sind, wenn nicht anders angegeben.

So etwas wie den Kauf einer Mülltonne und das Auffinden eines winzigen Müllhaufens im Inneren.

+0

Ich glaube nicht, dass es wirklich notwendig ist. Was sagt der Javadoc? – robermann

+4

Ich sehe das nicht die ganze Zeit ... oder überhaupt. Wo kommst du darauf? –

+0

Das mache ich nie. Und habe auch nie Probleme gesehen. – Batty

Antwort

0

Dies ist erforderlich, wenn entweder ObjectInputStream und ObjectOutputStream verwenden, weil sie den Anruf einen Header über den Strom, bevor die ersten Schreib senden. zu flush() aufgerufen wird, Senden Sie diesen Header an die Remote-Seite

Nach der spec, der Header vorhanden s der folgenden Inhalte:

magic version 

Wenn der Header im Moment nicht ankommen ein Object ist zu bauen, wird dieser Anruf hängen, bis es die Header-Bytes empfangen.

Das bedeutet, wenn das betreffende Protokoll mit ObjectStream s geschrieben wird, sollte es nach dem Erstellen einer ObjectOutputStream gelöscht werden.

1

Wenn Sie Daten in einen Stream schreiben, wird eine gewisse Pufferung auftreten, und Sie wissen nie genau, wann die letzten Daten tatsächlich gesendet werden. Sie können viele Rite-Operationen in einem Stream ausführen, bevor Sie sie schließen, und das Aufrufen der flush() -Methode garantiert, dass die letzte der Daten, von der Sie dachten, dass sie bereits geschrieben wurde, tatsächlich in die Datei gelangt. Wann immer Sie eine Datei verwenden, entweder lesen oder schreiben, sollten Sie die Methode close() aufrufen. Wenn Sie Datei-I/O-Vorgänge ausführen, verwenden Sie teure und eingeschränkte Betriebssystemressourcen. Wenn Sie also fertig sind, werden Sie durch Aufrufen von close() diese Ressourcen freigeben.

+1

Ich bin mir nicht sicher, dass dies erklärt, warum es notwendig ist, den Ausgabestrom zu leeren *, bevor Sie irgendwelche Schreiboperationen durchführen. –

+0

Ja nach dem Schreiben in den Stream, aber was ist nach der ersten Erstellung? Ich sehe nicht die gleiche Situation vor dem Schreiben von irgendetwas vor. –

+1

Stimmt, aber scheint nichts mit Frage zu tun zu haben. OP fragt, warum der Stream gleich nach der Erstellung gespült werden soll (wo keine Daten enthalten sein sollten). – Pshemo

2

In über 15 Jahren, in denen ich Java auf professionellem Niveau geschrieben habe, bin ich noch nie auf die Notwendigkeit gekommen, einen Stream zu löschen, bevor ich ihn schreibe.
Der Spülvorgang würde überhaupt nichts tun, da es nichts zu spülen gibt.
Sie möchten den Stream vor dem Schließen spülen, obwohl die close-Operation das für Sie tun sollte, wird es oft als beste Vorgehensweise angesehen, dies explizit zu tun (und ich habe Situationen erlebt, in denen das offensichtlich war nicht tatsächlich einen Flush ersten.
Vielleicht mit, dass Sie verwirrt sind?

+0

Ich verwechsle nicht die Spülung nach der ersten Erstellung mit Spülen vor dem Schließen von Streams. Ich wurde dazu gebracht zu glauben, dass nach dem Abrufen des OutputStream-Objekts einige Sachen von Anfang an im Puffer liegen. Ich wollte nur wissen * was * das ist und warum es überhaupt da ist. – krystah

Verwandte Themen