Heim >Java >javaLernprogramm >Wie verarbeitet man Eingabe-/Ausgabeströme in Java-Prozessen zuverlässig?

Wie verarbeitet man Eingabe-/Ausgabeströme in Java-Prozessen zuverlässig?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-17 21:16:11774Durchsuche

How to Reliably Handle Input/Output Streams in Java Processes?

Java-Prozess mit Eingabe-/Ausgabestream

In diesem Artikel werden die Feinheiten der Verwendung von Eingabe- und Ausgabestreams bei der Arbeit mit Java-Prozessen untersucht. Wir werden uns insbesondere auf die Lösung von Herausforderungen konzentrieren, die bei der Aufrechterhaltung der Funktionalität dieser Streams auftreten.

Hintergrund

Das bereitgestellte Codebeispiel veranschaulicht ein Szenario, in dem Befehle in die Bash-Shell eingegeben werden können und die daraus resultierende Ausgabe erfolgt wiederholte sich. Allerdings treten nach dem ersten Lesevorgang Probleme auf, die dazu führen, dass nachfolgende Ausgabeströme nicht mehr funktionieren. Ziel dieses Artikels ist es, diese Probleme zu erläutern und Lösungen vorzuschlagen.

Lösung des Problems

Der erste Schritt besteht darin, das Code-Snippet zu ändern, um die ProcessBuilder-Klasse zu nutzen, was die externe Prozessausführung vereinfacht. Sein Hauptvorteil ist die Möglichkeit, den Standardfehlerstrom des untergeordneten Prozesses in seine Standardausgabe umzuleiten.

ProcessBuilder builder = new ProcessBuilder("/bin/bash");
builder.redirectErrorStream(true);
Process process = builder.start();

Außerdem neigen die Schleifen, die für das Lesen der Standardausgabe des Prozesses verantwortlich sind, zum Hängen, da sie erst am Ende beendet werden -of-file vom Reader. Um dieses Problem zu lösen, wird eine Technik mit einer „magischen“ Linie eingesetzt, um den Abschluss der Ausgabe des Shell-Befehls abzugrenzen.

while (scan.hasNext()) {
    String input = scan.nextLine();
    writer.write("((" + input + ") && echo --EOF--) || echo --EOF--\n");
    writer.flush();

    line = reader.readLine();
    while (line != null && ! line.trim().equals("--EOF--")) {
        System.out.println ("Stdout: " + line);
        line = reader.readLine();
    }
    if (line == null) {
        break;
    }
}

Einschränkungen

Es ist unbedingt erforderlich, die Einschränkungen dieses Ansatzes anzuerkennen :

  • Befehle, die eine Benutzereingabe erfordern, können dazu führen, dass das Programm angezeigt wird reagiert nicht.
  • Die Annahme, dass jede Prozessausgabe durch eine neue Zeile beendet wird, trifft möglicherweise nicht in allen Fällen zu.
  • Seltene Fälle, in denen der ausgeführte Befehl „--EOF--“ ausgibt, können dazu führen fehlerhaftes Verhalten.
  • Nicht übereinstimmende Klammern in Bash-Befehlen können zu Syntaxfehlern und Prozessfehlern führen Beendigung.

Fazit

Die in diesem Artikel beschriebenen Änderungen bieten eine umfassende Lösung für die Herausforderungen, die bei der Aufrechterhaltung der Funktionalität von Eingabe-/Ausgabeströmen bei der Arbeit mit Java-Prozessen auftreten. Obwohl die Technik gewisse Einschränkungen aufweisen kann, bietet sie eine zuverlässige Möglichkeit, Shell-Befehle auszuführen und ihre Ausgabe regelmäßig über eine geplante Aufgabe abzurufen.

Das obige ist der detaillierte Inhalt vonWie verarbeitet man Eingabe-/Ausgabeströme in Java-Prozessen zuverlässig?. 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