Umleiten der Ausgabe eines Prozesses in die Eingabe eines anderen Prozesses mithilfe von ProcessBuilder in Java

Evgenii.Balai

Ich habe zwei Prozesse von processBuilders definiert:

ProcessBuilder pb1 = new ProcessBuilder (...)
ProcessBuilder pb2 = new ProcessBuilder (...)

Ich möchte, dass die Ausgabe von pb1die Eingabe von ist pb2. Ich habe in der Dokumentation festgestellt, dass ich die Eingabe pb2von mithilfe eines Pipe aus einem anderen Prozess lesen kann:

pb2.redirectInput(Redirect.PIPE);

Wie kann ich jedoch angeben, dass diese Pipe aus der Ausgabe von gelesen werden soll pb1?

Marmelade

static ProcessBuilder.Redirect INHERIT Gibt an, dass die Quelle oder das Ziel der Unterprozess-E / A mit denen des aktuellen Prozesses identisch sind.

static ProcessBuilder.Redirect PIPE Gibt an, dass die E / A des Unterprozesses über eine Pipe mit dem aktuellen Java-Prozess verbunden werden.

Ich denke also nicht, dass eine davon Ihnen helfen wird, die Ausgabe eines Prozesses auf die Eingabe eines anderen Prozesses umzuleiten. Sie müssen es selbst implementieren.

Implementierung:

public class RedirectStreams {
public RedirectStreams(Process process1, Process process2) {
    final Process tmpProcess1 = process1;
    final Process tmpProcess2 = process2;
    new Thread(new Runnable() {
        @Override
        public void run() {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(tmpProcess1.getInputStream()));
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(tmpProcess2.getOutputStream()));
            String lineToPipe;

            try {

                while ((lineToPipe = bufferedReader.readLine()) != null){
                    System.out.println("Output process1 / Input process2:" + lineToPipe);
                    bufferedWriter.write(lineToPipe + '\n');
                    bufferedWriter.flush();
                }

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

}

Dieser kann sicherlich schöner gestaltet werden und ich habe nicht getestet, ob er sicher läuft, aber er macht den Job.

Verwendung:

RedirectStreams redirectStreams = new RedirectStreams(process1,process2);

Prüfung:

public class ProcessPipeTest {
@Test public void testPipe(){
    try {

        Process process1 = new ProcessBuilder("/bin/bash").start();
        Process process2 = new ProcessBuilder("/bin/bash").start();

        RedirectStreams redirectStreams = new RedirectStreams(process1,process2);

        
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(process1.getOutputStream()));
        String command = "echo echo echo";
        System.out.println("Input process1: " + command);
        bufferedWriter.write(command + '\n');
        bufferedWriter.close();

        
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process2.getInputStream()));
        String actualOutput = bufferedReader.readLine();
        System.out.println("Output process2: " + actualOutput);
        assertEquals("echo",actualOutput);

    } catch (IOException e) {
        e.printStackTrace();
    }
}
}

Ausgabe:

Eingabeprozess1: Echo Echo Echo

Ausgabeprozess1 / Eingabeprozess2: Echoecho

Ausgabeprozess2: Echo

Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.

Bei Verstößen wenden Sie sich bitte [email protected] Löschen.

bearbeiten am
0

Lass mich ein paar Worte sagen

0Kommentare
LoginNach der Teilnahme an der Überprüfung

Verwandte Artikel

Verketten Sie die Ausgabe eines Prozesses mit der Eingabe eines anderen Prozesses

Wie liest man die Ausgabe eines Prozesses und schreibt sie in die Eingabe eines anderen Prozesses in C?

Speicherverbrauch eines von Java ProcessBuilder initiierten Prozesses

Interagieren Sie mit der Standardeingabe / -ausgabe eines anderen Prozesses

Schreiben in die Konsole eines anderen Prozesses mithilfe der API (ohne die Standardeingabe umzuleiten)

Abrufen der Ausgabe eines von CreateProcess erstellten Prozesses

Lesen von der Ausgabe eines Prozesses in ein ByteArray

Wie kann man die Ausgabe eines Telnet-Prozesses umleiten oder abrufen, der von einem Powershell-Skript ausgeführt wird?

Erfassen Sie die Ausgabe eines Prozesses in Julia

Ausgabe eines Prozesses, der nicht gedruckt wird

Neustarten eines Prozesses von einem anderen Prozess

Kann die Thread-ID eines Multithread-Prozesses mit der Prozess-ID eines anderen laufenden Prozesses übereinstimmen?

Erhöhen eines ProcessBuilder-Prozesses über die Benutzerkontensteuerung?

Beenden eines Prozesses mithilfe von pid und Auffinden eines Benutzers, der im Systemaufruf an pid gebunden ist

Node.js fängt die Ausgabe eines anderen Prozesses ab

Was passiert in Hadoop, wenn die Eingabe eines Systems von der Ausgabe eines anderen Systems abhängt?

Wie würden Sie die Ausgabe eines Prozesses streamen?

Wie filtert man die (grep) Ausgabe eines Prozesses in Procfile?

So leiten Sie die Ausgabe eines bereits laufenden Prozesses um

So protokollieren Sie die Live-Ausgabe eines laufenden Prozesses

Abrufen der ersten Zeile einer laufenden Ausgabe eines untergeordneten Prozesses

Wie kann die Ausgabe eines Prozesses erfasst werden, der in ein Rust-Programm geleitet wird?

Steuern eines interaktiven Prozesses mit PHP mithilfe von Symfony Process

PowerShell: Prozessorauslastung eines Prozesses mithilfe der Proc-ID abrufen

So erhalten Sie die Umgebungsvariable eines anderen Prozesses mit c #

Festlegen der Terminalgröße (ala `stty column`) eines anderen Prozesses?

So senden Sie eine Eingabe an stdin eines mit Befehl erstellten Prozesses UND erfassen Sie dann die Ausgabe (und den Status)

Der beste Weg, um an der mehrzeiligen Ausgabe eines externen Prozesses zu arbeiten, der von einem groovigen Skript aufgerufen wird?

Wie finde ich die PID eines Prozesses von Python?

TOP Liste

  1. 1

    So legen Sie mit dem Interface Builder unterschiedliche führende Speicherplätze für unterschiedliche Geräte fest

  2. 2

    Fügen Sie eine weitere Schaltfläche zu gwt Suggest Box hinzu

  3. 3

    Wie konvertiere ich einen Vektor von Bytes (u8) in eine Zeichenfolge?

  4. 4

    Wie kann ich in SCSS mehrere Klassen zu einer einzigen kombinieren?

  5. 5

    Wie konvertiert man einen Datenrahmen im langen Format in eine Liste mit einem geeigneten Format?

  6. 6

    Speichern Sie ein MPAndroidChart-Diagramm in einem Bild, ohne es in einer Aktivität anzuzeigen

  7. 7

    Gruppieren Sie Datenrahmenspalten nach ihrem Datum (die Spaltentitel enthalten) und fassen Sie die Instanzen von Einsen und Nullen in R . zusammen

  8. 8

    Tomcat - Leiten Sie den alten Kontextstamm zum neuen Kontextstamm um

  9. 9

    Eclipse Oxygen - Projekte verschwinden

  10. 10

    Wie wählt man Unterschiede mit drei Tabellen aus?

  11. 11

    Tic Tac Toe-Spiel im React-Reset-Button funktioniert nicht

  12. 12

    So berechnen Sie die Verfügbarkeit von Anwendungen (SLA)

  13. 13

    ElasticSearch BulkShardRequest ist aufgrund von org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor fehlgeschlagen

  14. 14

    Wie kann ich den Kaskadenmodus global einstellen?

  15. 15

    Python: Spalten mit demselben Namen zusammenführen, wobei der Mindestwert beibehalten wird

  16. 16

    So erhalten Sie eine gleichmäßige Höhe für alle Eingabefelder

  17. 17

    Wie erstelle ich einen neuen übergeordneten Knoten außerhalb der .ref (/ path) in der Firebase-Echtzeitdatenbank mithilfe von Cloud-Funktionen (Typescript)?

  18. 18

    Was ist schneller: SUM über NULL oder über 0?

  19. 19

    Wie kann ich eine verschachtelte Schleife mit lapply in R ersetzen?

  20. 20

    Kann ich ein Tkinter-Canvas erstellen, das mehrere Zeilen in einem Text-Widget umfasst?

  21. 21

    Ärgerliches Problem mit yaml, das ich nicht lösen kann

heißlabel

Archiv