Java + Eclipse: Synchronisieren Sie stdout und stderr

8

Ich benutze Eclipse. Wenn ich eine solche Anwendung habe:

%Vor%

Die Ausgabe sieht oft so aus:

%Vor%

Gibt es eine Möglichkeit, diese beiden Ausgangsströme zu synchronisieren? Natürlich ohne einige Millisekunden nach dem Block von 20 mal Hello World zu warten und ein paar Millisekunden nach dem Drucken von ERROR zu warten.

    
Martijn Courteaux 24.05.2010, 12:22
quelle

4 Antworten

7

Ob Sie es glauben oder nicht, Spülen ist hier keine Lösung ....

Wenn ein Stream zu "einer Abstraktion führt, die vom zugrunde liegenden Betriebssystem bereitgestellt wird" (z. B. ein Laufwerk oder eine Konsole), dann werden die verbleibenden Bytes "an das Betriebssystem zum Schreiben weitergegeben; es garantiert nicht, dass sie tatsächlich geschrieben werden .. . "(siehe die OutputStream-Dokumentation ). Der Schlüssel hier ist, dass das Betriebssystem Flushes von verschiedenen Streams in verschiedenen Ordnungen behandeln kann, wenn es dies wünscht.

Ich hatte das gerade in meinem Programm. Ich hatte eine Fehlermeldung zwischen zwei normalen Nachricht, die beide vor der Fehlermeldung gelöscht hatte.

Die Frage bleibt also: Gibt es eine integrierte Möglichkeit, zwei Streams zu synchronisieren? Oder müssen wir das manuell handhaben?

    
Vimes 17.11.2010 01:03
quelle
6

Für eine "ernsthafte" Verwendung schreibe ich lieber nicht direkt in System.out/System.err , da es das Ziel fest codiert, und es verwendet auch das ziemlich schrullige PrintStream (ist es ein Byte-Stream oder ein Zeichenstrom?) . Wenn Sie die Ausgabestreams in Ihre eigene PrintWriter umbrechen, können Sie sie so einstellen, dass sie automatisch gespült wird - das zweite Argument im Konstruktor ist auto-flush .

z. B.

%Vor%

Siehe

mdma 24.05.2010 12:43
quelle
2

System.out und System.err sind normale PrintStream -Objekte (die eine flush () -Methode bereitstellen), also probiere System.out.flush() und System.err.flush() .

    
aioobe 24.05.2010 12:23
quelle
-2

Fügen Sie eine Flush hinzu, gefolgt von einer Thread.sleep(1) , 99,9% output order wird korrekt sein.

Zum Beispiel wird dies wie erwartet angezeigt.

%Vor%

Der einzige Nachteil ist der Schlaf für 1 Millisekunde, d.h. 1/1000 Sekunde

    
Robert Wolf 08.05.2012 20:32
quelle