Ich habe zwei Prozesse von processBuilders definiert:
ProcessBuilder pb1 = new ProcessBuilder (...)
ProcessBuilder pb2 = new ProcessBuilder (...)
Ich möchte, dass die Ausgabe von pb1
die Eingabe von ist pb2
. Ich habe in der Dokumentation festgestellt, dass ich die Eingabe pb2
von 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
?
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.
Lass mich ein paar Worte sagen