Prozessausgabe asynchron erfassen und umleiten
Beim Starten von Prozessen mit ProcessBuilder besteht manchmal die Notwendigkeit, ihre stdout- und stderr-Ausgabe weiterzuleiten, ohne die zu blockieren Hauptthread. Standardmäßig blockiert das Lesen aus Prozessströmen den Aufrufer, wodurch es für Aufgaben, die Parallelität erfordern, ungeeignet ist.
Ein Ansatz zur Erzielung einer asynchronen Ausgabeumleitung besteht darin, manuell einen Thread zu erstellen, der den stdOut-Stream kontinuierlich überwacht und dessen Inhalte schreibt System.out. Dieser Ansatz kann jedoch umständlich sein und erfordert zusätzliche Thread-Verwaltung.
Um diesen Prozess zu rationalisieren, bietet ProcessBuilder die inheritIO-Methode an, die die Standard-E/A-Streams des Unterprozesses nahtlos auf die gleichen wie die des Unterprozesses setzt Aufruf eines Java-Prozesses. Dadurch wird sichergestellt, dass alle vom Unterprozess generierten Ausgaben direkt an die Konsole gesendet werden, ohne dass eine manuelle Thread-Erstellung erforderlich ist:
Process p = new ProcessBuilder().inheritIO().command("command1").start();
Alternativ kann für ältere Java-Versionen, die inheritIO nicht unterstützen, eine benutzerdefinierte Implementierung mithilfe von Threads erfolgen eingesetzt werden:
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(); }
Diese Implementierung erstellt Threads, die die Eingabe- und Fehlerströme des Unterprozesses überwachen und ihre Daten an System.out bzw. System.err weiterleiten. Die Threads werden automatisch beendet, wenn der Unterprozess abgeschlossen ist, da die Eingabeströme ihr Ende erreichen.
Das obige ist der detaillierte Inhalt vonWie kann ich Prozessausgaben in Java asynchron erfassen und umleiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!