2012-04-03 9 views
2

Ich habe einige einfachen Code, der Java Apache Exec Klassen verwendet, um externe Prozesse auszuführen.Fehlende Befehlszeilenausgabe von Java-Prozess in Windows

Executor ex = new DefaultExecutor(); 
    ex.setStreamHandler(new PumpStreamHandler(System.out, System.out, System.in)); 
    CommandLine cl = new CommandLine(
    "C:\\program.exe"); 

    ex.execute(cl); 

}

Für bestimmte Programme Kommandozeile, das funktioniert wie erwartet und bekommt alle die Ausgabe des Programms in den „out“ Strom, während meines eigenen Text in den „in“ Strom zu akzeptieren. Bei anderen Programmen ist die Ausgabe des Prozesses jedoch sichtbar und wird manuell über die Befehlszeile ausgeführt, aber ich bekomme nichts, wenn ich über einen Java-Prozess laufe.

Ich möchte schließlich in die Stdin schreiben und stdout innerhalb des Codes selbst abrufen und analysieren.

Wenn es einen Grund gibt, dass ich nicht weiß, warum einige Programme scheinen Text in der Befehlszeile, aber wenn ich sie als Java-Prozesse ausführen, bekomme ich nichts durch die Streams?

Dies geschieht in Windows.

+0

vielleicht haben Sie das Problem von dieser Frage: http://stackoverflow.com/questions/27249101/windows-prevents-stdout-from-external-command-line-executions-to-be-reedirected-t – radio

Antwort

0

Out of Process-Code wird nicht zur selben Befehlszeilenausgabe geleitet, es sei denn, Sie konfigurieren ihn explizit dafür. Außerdem ist es in der Regel besser, eine Logging-Bibliothek wie log4j zu verwenden, um println-Anweisungen auszuführen.

+0

würde ich mag schließlich in der Lage sein, in den Prozess stdin zu schreiben und von seinem stdout innerhalb meines Java-Codes selbst zu lesen, einen Menschen an der Aufforderung imitierend. Ist das mit dieser Einschränkung möglich? – user1309154

+0

Sie können, aber es ist nervig. Verwenden Sie getOutputStream/getInputStream in der Process-Klasse zum Konfigurieren. Aber ich habe gelesen, dass, wenn Sie das innerhalb des externen Prozesses selbst tun, es Deadlocks erzeugen kann. Es gibt Problemumgehungen (anscheinend können Sie die Konfiguration in einem anderen Prozess tun). Alternativ dazu scheint es, als ob Sie ProcessBuilder verwenden können, um I/O-Streams umzuleiten: http://stackoverflow.com/questions/3643939/java-process-with-input-output-stream – smcg

+0

Ich kann Missverständnis sein. Aber in meinem Code übergebe ich das System.out und in Streams in den PumpStreamHandler-Konstruktor, eine Apache-Exec-Klasse, die ich glaube, macht dies von Streams intern. Meine Frage ist, dass ich für einige externe Programme, einschließlich Dummy-Programmen, die ich selbst schreibe, erfolgreich alle Ausgaben abrufen kann, aber einige andere externe Programme geben mir leere Ausgabe, obwohl sie in der Windows-Befehlszeile korrekt ausgegeben werden. – user1309154

Verwandte Themen