Wie bekomme ich alle Ausgaben von runTime.exec()

Grumbleman

Mitglied
Hi,

ich bin neu hier und weiss nun leider nicht genau ob diese Frage hier hereinpasst.

Ich hab mir ein kleines Tool gebastelt, dass Ordner nach duplikaten durchsucht.
Das funktioniert unter Linux bereits mit dem Tool fdupes. Mein Tool stellt dazu eher ein GUI dar.

Mein Problem ist, dass dieses Kommandozeilentool eine ganze Weile braucht um diese Duplikate zu finden.
Wenn ich das fdupes auf der Kommandozeile starte, zeigt es mir mit einer Ausgabezeile seinen Fortschritt an. Wenn es fertig ist und die Liste der Duplikate ausspuckt, dann verschwindet vorher diese Fortschrittszeile und die Ergebnisse werden aufgelistet. Diese Ergebnisse bekomme ich zurueck. Haette aber gern zur Fortschrittsanzeige, gern auch diese zurueckbekommen. Das bekomme ich aber nicht hin.

Ich rufe das Kommando mit

Code:
String pth[] ={"fdupes","-r",pt};
p= Runtime.getRuntime().exec(pth);

auf. Es funktioniert alles soweit sehr gut. Ich bekomme am Ende vom BufferedReader
Code:
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));

auch beinahe alle zurueck, was ich haben will, nur halt wie gesagt die Fortschrittsanzeige nicht.

Vielleicht hat hier jemand eine Idee, ob dies ueberhaupt funktionieren kann?

Ich habe schon viel gesucht, allerdings weiss ich nicht wie genau ich das Problem mit guten Suchbegriffen umschreiben kann.
 
Zuletzt bearbeitet:
Vermutlich schreibt fdupes (kanns grad nicht testen) die Fortschrittsanzeige auf die Standardfehlerausgabe und nicht auf die Standardausgabe.
Will heißen: Überprüfe doch am besten mal die Standardfehlerausgabe mit
Code:
new BufferedReader(new InputStreamReader(p.getErrorStream()));
und guck, ob du da fündig wirst.

P.S. Da du von Fortschrittsanzeige sprichst, vermute ich, dass du dort sehr viel bekommst, als zuerst erwartet, da eine Fortschrittsanzeige meist so implementiert ist, dass am Ende der Zeile ein Carriage Return (cr, \r) verwendet wird, um wieder vom Anfang der Zeile zu schreiben (wird von den meisten Konsolen unterstützt). Falls man das alles nun in eine Datei schreibt, könnte es zu überraschenden Ergebnissen führen.
 
Danke fuer die Antwort, das waere natuerlich eine Moeglichkeit, ich teste das gleich mal aus.

Vielleicht ist es auch die Standard Ausgabe aber durch das Loeschen der Zeile wird es bei der Ausgabe im Stream immer nicht gepostet...
 
Danke fuer die Antwort, das waere natuerlich eine Moeglichkeit, ich teste das gleich mal aus.

Vielleicht ist es auch die Standard Ausgabe aber durch das Loeschen der Zeile wird es bei der Ausgabe im Stream immer nicht gepostet...

-> Du hast Recht gehabt. :applaus: Die Ausgabe des Fortschritts kann man ueber den ErrorStream auslesen.

Problematisch ist allerdings, dass ich die Ausgabe nicht anzeigen kann, solange die Sache nicht abgeschlossen ist. Mir nuetzt die Info des Fortschritts also gar nichts.

Gibt es eine Moeglichkeit diese Ausgabe direkt anzuzeigen, ohne das auf das Ende des Prozesses gewartet werden muss?

Vielleicht ist BifferedReader hier nicht so gluecklich gewaehlt, da dessen Inhalt scheinbar erst nach dem beenden des Prozesses angezeigt wird. Ich brauche wohl eher etwas, dass die Ausgaben sofort/direkt anzeigen kann.
 
Zuletzt bearbeitet:
Vielleicht ist BifferedReader hier nicht so gluecklich gewaehlt, da dessen Inhalt scheinbar erst nach dem beenden des Prozesses angezeigt wird. Ich brauche wohl eher etwas, dass die Ausgaben sofort/direkt anzeigen kann.

Im seperaten Thred die genannten Streams auslesen.
 
Also ich habe es nun hinbekommen, dass die Werte waehrend des laufenden Threads ueber StdOut angezeigt werden, allerdings bekomme ich kein Update in der Gui hin. Alles Repaint hilft nichts. Die Gui zeichnet sich erst nach dem Ablauf neu. Ich wollte eigentlich die ErrorAusgabe in ein Label schreiben und sozusagen dieses als Fortschrittsanzeige nutzen, aber es zeichnet sich nicht neu... ???:L
 
Java:
try {
String pth[] ={"fdupes","-r",pt};
edit_progress.setText(" vor Start");
edit_progress.repaint(1);
ProcessBuilder pb = new ProcessBuilder(pth);
pb.redirectErrorStream(true);
Process proc = pb.start();
System.out.println("Process started !");
/* Read the process's output */
String line;             
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
edit_progress.setText("Start");
edit_progress.repaint();

	while ((line = in.readLine()) != null) {
	    System.out.println(line);
	    edit_progress.setText(line);
	    edit_progress.repaint(1);
	    splitpaneRight.repaint();
	    frmCheckForFile.repaint();
					} 
	/* Clean-up */
proc.destroy();
System.out.println("Process ended !");
edit_progress.setText("Ende");
edit_progress.repaint();
}

Ich habe mittlerweile auf den ProcessBuilder umgeschwenkt, da dieser besser funktionieren soll als RunTime.exec()
Die System Outs werden schoen waehrend des Laufs geschrieben, das Eingabefeld wird allerdings nicht aktualisiert...
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben