Ausgabe in Kommandozeile

Hallo zusammen,

mal wieder ein kleines Java-Problemchen. Das Grundproblem ist eigentlich, dass ich anzeigen möchte, wie weit mein Programm in seiner Berechnung fortgeschritten ist. Was mit Java ja einfach geht, ist, über

System.out.println(…)

Sachen (zum Beispiel einen Counter) zeilenweise untereinander in die Kommandozeile zu schreiben. Das ist aber gar nicht so super, denn nach 1 Mio Ausgaben ist alles was am Anfang stand irgendwie weg. Die optimalste Lösung wäre es, irgendwie in die Kommandozeile schreiben zu können:

>> Progress: X

und X wird dann hochgezählt. Dazu müsste man an der Stelle verschiedene Ausgaben machen, die die alte immer wieder überschreiben - ich nehme mal an, das geht nun wirklich nicht.

Also ist die momentan aktuelle Idee, eine zurechtgefriemelte Progressbar in die Kommandozeile zu setzen. Das soll in etwa so aussehen:

>> Progress: 0% 50% 100%
>> | | |
>> #########################

(okay, das zerhaut mir hier die Software irgendwie, aber ich denke, es ist erkennbar, was ich meine)

wobei die Reihe aus Rauten nach und nach aufgebaut wird. Die Rauten wollte ich durch

System.out.print("#")

schreiben lassen, aber leider passiert dabei überhaupt nichts. Die Ausgaben kommen erst dann alle gesammelt, wenn das nächste „System.out.println()“ kommt. Den PrintStream zu flushen nach jeder der „#“-Ausgaben bringt nichts.

Jetzt die eigentliche Frage: wie gebe ich Zeichen in einer Zeile nacheinander aus? Und geht nicht vielleicht doch irgendwie die erste version, so dass ich mir die Progressbar schenken kann?

Viele Grüße
Schorsch

PS: nein, kein GUI.

Hallo Schorsch,

ich habe leider zur Zeit keine Java-Umgebung hier sonst hätte ich es schnell getestet.

Für deine erste Version (Idee) würde ich es mit System.print(…) in kombination mit Escape-Sequenzen versuchen.
http://de.wikipedia.org/wiki/Escape-Sequenz

Grüße,
Marco

Hallo Marco,

vielen Dank für Deine Antwort. Ich war mir erst nicht ganz sicher, wie mir die Escape-Sequenzen bei meinem Problem helfen können, aber habe dann das Zeichen für Backspace ("\b") gefunden. Aber es funktioniert leider nicht ganz so, wie ich mir das dachte: den Counter hinschreiben, dann wieder löschen und durch den nächsten ersetzen.

Zum einen werden sämtliche Outputs mit System.out.print(…) immernoch irgendwie gesammelt und erst beim nächsten System.out.println() mit ausgegeben (bzw. bei Programmende). Zum anderen löscht „\b“ nicht wirklich, sondern es kommt einfach ein nettes viereckiges Kästchen als Output. Da stellt sich automatisch auch die Frage: was macht eigentlich „\b“ in Java?

Oder hattest Du mit den Escape Sequenzen etwas anderes im Sinn?

Viele Grüße
Schorsch

Hi Schorsch,

eigentlich meinte ich das genau so wie du es beschrieben hast.
Habe dir mal ein gleines Beispiel geschrieben (schau unten). Die Ausgabe des Programms sieht wie folgt aus:
[marco@home ~]$ java TestOutput
Loop count: 9

Das wars!
[marco@home ~]$

Wobei die 9 in der Ausgabe der Endwert ist und wärend der Ausführung von 0 – 9 zählt.

Code:

class TestOutput {
 public static void main(String[] args) {
 System.out.print("Loop count: ");
 for(int i=0; i

Hoffe es hilft!

Grüße,
Marco
1 Like

Hi Marco,

vielen Dank für das Beispiel. Ja, es funktioniert. Ich habe die ganze Zeit nicht wirklich in die Shell geschaut, sondern immer hier in Netbeans auf den Output gestarrt. Und da wird „\b“ immer als Kästchen ausgegeben und kein Character wird gelöscht. Aber wenn ich das Programm mal so starte, wie es eigentlich später auch gedacht ist, funktioniert es super. Dankeschön.

Hast du eine Idee, warum das in der IDE nicht geht?

Viele Grüße
Schorsch

IDE != Kommandozeile … :frowning:
Ich nochmal :smile:

Ich habe jetzt mal ein bisschen damit rumgespielt, und leider verhält sich die Ausgabe in der Kommandozeile und die in meiner IDE nicht gleich (noch ungleicher, als ich zunächst dachte). In der Kommandozeile funktioniert alles wie gewünscht: die alte Zahl wird gelöscht und die neue hingeschrieben, und zwar sofort. In Netbeans funktioniert davon nichts. Der Output erscheint erst dann gesammelt, wenn das Programm fertig abgelaufen ist, und auch dann funktioniert der „\b“ nicht, sondern an seiner Stelle wird immer ein kleines Kästchen ausgegeben.

Kann man erklären, warum das so ist? Nach einer Lösung wage ich garnicht zu fragen :wink:

Viele Grüße
Schorsch

Guten Morgen Schorsch,

freut mich dir geholfen zu haben! Ich kann dir leider nicht sagen wieso sich NetBeans bei der Ausgabe so verhält. Um ehrlich zu sein, ich kenne es noch nicht mal – ich weiss nur das es von IBM ist. :wink:.

Wäre aber mal eine interessante Frage, bekommst du überhaupt eine Ausgabe bevor das Programm beended ist? Wie sieht es bei einem einfachen Testprogramm aus, in der eine Schleife – etwas Zeit verzögert - nur die Zahlen 0-9 ausgibt, also ohne jegliche Formatierung?

Grüße,
Marco

Hallo Marco,

es wird irgendwie immer seltsamer :smile: Ich habe jetzt einfach mal in die Main eine Schelife mit Ausgabe gesetzt:

for (int i = 0; i

Hallo Schorsch,

Ich bin verwirrt :smile:

Endlich bin ich in guter Gesellschaft :wink:

Ich glaube nun wird es Zeit mal in das Manuel von NetBeans zu schauen. Vielleicht steht da ja was über das Ausgabefenster und seine Eigenschaften drin.

So mal ins Blaue geradeten, da das schreiben auf die Konsole (das Ausgabefenster) doch sehr langsam ist könnte es sein das NetBeans die Ausgabe buffert und erst ausgibt wenn das Programm durchgelaufen ist, um den durchlauf zu beschleunigen.
Wobei ich das doch sehr übel finden würde da ich die Ausgabe regelmäsig nutze um mir mal einen Vorgang genauer an zu schauen.

Vielleich kann es NetBeans aber auch einfach nicht anders, also wenn es zu schnell geht die Ausgabe verschlucken :wink:

Grüße,
Marco

P.S. Danke für den Stern!