Beim Erstellen eines Prozesses mit ProcessBuilder kann es wünschenswert sein, stdout und/oder stderr asynchron zu erfassen und an System.out umzuleiten. Herkömmliche Ansätze, wie das manuelle Erzeugen eines Threads zum kontinuierlichen Lesen von stdOut, sind umständlich und ineffizient.
Glücklicherweise wurde in Java 7 die Methode ProcessBuilder.inheritIO eingeführt, die praktischerweise die Standard-E/A des Unterprozesses auf den gleichen Wert festlegt als aktueller Java-Prozess. Dadurch entfällt die Notwendigkeit zusätzlicher Threads oder komplexer Ausgabeumleitungslogik.
Für Java 7 und höher rufen Sie einfach Folgendes auf:
Process p = new ProcessBuilder().inheritIO().command("command1").start();
Für frühere Versionen von Java ist eine benutzerdefinierte Lösung erforderlich:
public static void main(String[] args) throws Exception { Process p = Runtime.getRuntime().exec("cmd /c dir"); inheritIO(p.getInputStream(), System.out); inheritIO(p.getErrorStream(), System.err); } private static void inheritIO(final InputStream src, final PrintStream dest) { new Thread(new Runnable() { public void run() { Scanner sc = new Scanner(src); while (sc.hasNextLine()) { dest.println(sc.nextLine()); } } }).start(); }
In dieser benutzerdefinierten Lösung werden Threads automatisch beendet, wenn der Unterprozess abgeschlossen ist, wenn der SRC-Stream EOF erreicht. Dies stellt eine ordnungsgemäße Ressourcenverwaltung sicher, ohne dass eine explizite Thread-Behandlung erforderlich ist.
Das obige ist der detaillierte Inhalt vonWie kann ich die ProcessBuilder-Ausgabe in Java effizient asynchron umleiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!