Heim  >  Artikel  >  Java  >  Wie kann ich die Prozessausgabe in Java asynchron umleiten?

Wie kann ich die Prozessausgabe in Java asynchron umleiten?

Linda Hamilton
Linda HamiltonOriginal
2024-11-18 08:20:02546Durchsuche

How to Redirect Process Output Asynchronously in Java?

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!

Stellungnahme:
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