2013-04-21 4 views
16

Ich möchte eine Java-Prozessausgabe in Richtung der Standardausgabe des übergeordneten Java-Prozesses umleiten.ProcessBuilder auf Standardausgabe umgeleitet

die Process-Klasse verwenden wie folgt:

public static void main(String[] args) { 
    ProcessBuilder processBuilder = new ProcessBuilder("cmd"); 
    processBuilder.directory(new File("C:")); 
    processBuilder.redirectErrorStream(true); // redirect error stream to output stream 
    processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); 
} 

Ich hätte erwartet, dass die Ausgaben von "cmd", die wie sind:

Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. Tous droits réservés.

werden in der DOS-Konsole angezeigt, die zum Ausführen des Java-Programms verwendet wird. In der DOS-Konsole wird nichts angezeigt.

In den anderen Diskussionsthreads sah ich Lösungen mit einer BufferedReader-Klasse: aber hier möchte ich die Ausgaben des Prozesses direkt in der Standardausgabe angezeigt werden, ohne BufferedReader oder "während des Lesens Schleife". Ist es möglich?

Danke.

+3

Blick auf die API für die System-Klasse für die Methoden, die Sie benötigen: 'Abstecken (...)', 'SetIn (...)', 'setErr (...) '. –

+0

Das sollte funktionieren. Ich verstehe nicht, warum das nicht so wäre. – Qix

Antwort

11

Sie haben ein Schlüsselstück vermisst, Sie müssen Ihren Prozess tatsächlich starten und auf Ihre Ausgabe warten. Ich glaube, dass dies funktionieren wird,

processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); 
// Start the process. 
try { 
    Process p = processBuilder.start(); 
    // wait for termination. 
    p.waitFor(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
+2

sollte akzeptiert werden Antwort @Elliott Frisch – gumuruh

12

ProcessBuilder.inheritIO() Versuchen Sie, das gleiche I/O als der aktuellen Java-Prozess zu verwenden. Darüber hinaus können Sie die Methoden daisy chain:

ProcessBuilder pb = new ProcessBuilder("cmd") 
    .inheritIO() 
    .directory(new File("C:")); 
pb.start(); 
+3

Nur eine Fußnote zu meiner eigenen Information - wenn Sie 'pb.destroy()' 'zu bald danach aufrufen, bekommen Sie nichts gedruckt (auch wenn Sie' System.out.flush() aufrufen '); –