Heim > Java > javaLernprogramm > Wie kann ich Prozessausgaben in Java asynchron erfassen und umleiten?

Wie kann ich Prozessausgaben in Java asynchron erfassen und umleiten?

DDD
Freigeben: 2024-11-20 02:57:02
Original
1051 Leute haben es durchsucht

How to Capture and Redirect Process Output Asynchronously in Java?

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();
Nach dem Login kopieren

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();
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage