Heim >Java >javaLernprogramm >Wie kann ich die ProcessBuilder-Ausgabe in Java effizient asynchron umleiten?

Wie kann ich die ProcessBuilder-Ausgabe in Java effizient asynchron umleiten?

DDD
DDDOriginal
2024-11-23 20:38:11711Durchsuche

How to Efficiently Redirect ProcessBuilder Output Asynchronously in Java?

Asynchrone Ausgabeumleitung für ProcessBuilder-Prozesse

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!

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