2009-07-02 6 views
0

Hoffentlich ist dies eine schnelle und einfache Frage über BufferedOutputStreams und DataOutputStreams in Java.Java-Netzwerk-E/A-Blockierung oder nicht?

Wenn ich Bytes in den Ausgabestream schreiben wie

myBufferedOutputStream.write(array); 
myDataOutputStream.write(array); 

Haben diese Methoden schreiben sie sofort zum Stream und zurück oder blockieren sie überhaupt?

Ich habe nichts in den Core-Java-Dokumenten gesehen, aber vielleicht macht meine Frage keinen Sinn, weil schreiben nie blockieren?

Jemand bitte setzen Sie mich gerade.

Danke, JBU

Antwort

0

Ich glaube, es über die Umsetzung abhängt. Wenn Sie etwas wie BufferedOutputStream verwenden, wird ein Aufruf an write() wahrscheinlich nicht "blockieren", da die Klasse Pufferung für Leistung bereitstellt. Wenn jedoch FileOutputStream verwendet wird, blockiert der Schreibaufruf abhängig davon, wie ausgelastet/verfügbar die E/A-Ressourcen im System sind, da ein Aufruf von write() tatsächlich zu diesem Zeitpunkt eine E/A-Operation auslösen kann Zeit zu vervollständigen.

1

Alle Lese- und Schreibmethoden in java.io.* können blockiert werden. Keine unterstützt asynchrone E/A. Zum Lesen muss es manuell unter Verwendung von .available() oder eines ähnlichen Mechanismus implementiert werden. Zum Schreiben, naja, du bist alleine.

1

Die API im Paket java.io. * kann blockiert werden. Es gibt jedoch eine spezielle API namens Java NIO (neue E/A oder nicht blockierende E/A), die Sie für azyklische E/A verwenden sollten.

Blick auf das Paket java.nio * Sie einige Beispiele finden Sie hier:. http://en.wikipedia.org/wiki/New_I/O

2

Peter Antwort war die beste, aber es wurde von ausgehend mit Fehlinformationen behaftet: nein, es „hängt nicht von die Umsetzung". Der ganze Sinn der Pufferung liegt darin, die Auswirkungen des Blockierens zu mildern, aber wenn der Puffer voll ist und die Ausgabehardware nicht bereit ist, wird write() blockieren. Aber da es gepuffert ist, blockiert es viel seltener und mit weit weniger Auswirkungen auf den Durchsatz als ein einfacher OutputStream. Puffern ist eine schnelle und einfache Möglichkeit, die Leistung erheblich zu verbessern.