Asynchrone Ausgabeumleitung für ProcessBuilder
Beim Ausführen von Prozessen in Java mit ProcessBuilder erfordert die Erfassung von stdout und stderr einen nicht blockierenden Ansatz. Das Erstellen eines Threads zur Abwicklung der Umleitungsaufgabe ist zwar eine Option, bringt jedoch Nachteile wie Thread-Verwaltung und -Beendigung mit sich.
ProcessBuilder.inheritIO
In Java 7 und höher , ProcessBuilder bietet die Methode inheritIO an. Diese Methode vereinfacht die Ausgabeumleitung, indem sie die Standard-E/A des Unterprozesses an die des aktuellen Java-Prozesses anpasst.
Process p = new ProcessBuilder().inheritIO().command("command1").start();
Diese Syntax leitet sowohl stdout als auch stderr nahtlos an die Konsole um, ohne den Hauptthread zu blockieren.
Java 6 und früher
Für Java 6 und frühere Versionen, a Es ist eine explizitere 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 Implementierung werden neue Threads erzeugt, um kontinuierlich von stdin zu lesen und seinen Inhalt an das gewünschte Ziel umzuleiten. Wenn der Unterprozess abgeschlossen ist, werden die Threads automatisch beendet, da der Eingabestream EOF erreicht.
Das obige ist der detaillierte Inhalt vonWie kann ich die Prozessausgabe in Java asynchron umleiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!