Frage

Wenn ich einen Prozess über Java Process Klasse habe ich vollen Zugriff auf den Standard des Prozesses in Standard aus, und Standard-Fehlerströme als Java InputStreams und OutputStreams. Aber ich kann nicht einen Weg finden, um nahtlos diese Ströme zu System.in, System.out und System.err zu verbinden.

Es ist möglich, redirectErrorStream() zu verwenden, um eine einzelne InputStream zu erhalten, die dem Standard des subprocess enthält und Standardfehler und nur eine Schleife durch das und es mir durch den Standard aussenden, aber ich kann nicht einen Weg zu tun, dass ein und lassen Sie die finden Benutzertyp in den Prozess, wie er oder sie könnte, wenn ich den C system() Aufruf verwendet.

Dies scheint in Java SE 7 möglich zu sein, wenn es darum geht, aus-ich frage mich nur, wenn es jetzt eine Abhilfe. Bonuspunkte, wenn das Ergebnis des isatty() im Kind-Prozess durch die Umleitung führt .

War es hilfreich?

Lösung

Sie müssen den Prozess out, err und Eingangsströme zu den Systemversionen. Der einfachste Weg, dies zu tun, ist mit dem IOUtils Klasse von der Commons IO-Paket. Die Kopiermethode schaut zu sein, was Sie brauchen. Die Kopiermethode Anrufungen müssen in separate Threads sein.

Hier ist der grundlegende Code:

// Assume you already have a processBuilder all configured and ready to go
final Process process = processBuilder.start();
new Thread(new Runnable() {public void run() {
  IOUtils.copy(process.getOutputStream(), System.out);
} } ).start();
new Thread(new Runnable() {public void run() {
  IOUtils.copy(process.getErrorStream(), System.err);
} } ).start();
new Thread(new Runnable() {public void run() {
  IOUtils.copy(System.in, process.getInputStream());
} } ).start();

Andere Tipps

Eine Variation Johns Antwort, die Commons IO kompiliert und benötigen Sie nicht verwenden:

private static void pipeOutput(Process process) {
    pipe(process.getErrorStream(), System.err);
    pipe(process.getInputStream(), System.out);
}

private static void pipe(final InputStream src, final PrintStream dest) {
    new Thread(new Runnable() {
        public void run() {
            try {
                byte[] buffer = new byte[1024];
                for (int n = 0; n != -1; n = src.read(buffer)) {
                    dest.write(buffer, 0, n);
                }
            } catch (IOException e) { // just exit
            }
        }
    }).start();
}

Für System.in verwenden Sie die folgende pipein() statt pipe()

pipein(System.in, p.getOutputStream());

Umsetzung:

private static void pipein(final InputStream src, final OutputStream dest) {

    new Thread(new Runnable() {
        public void run() {
            try {
               int ret = -1;
               while ((ret = System.in.read()) != -1) {
                  dest.write(ret);
                  dest.flush();
               }
            } catch (IOException e) { // just exit
            }
        }
    }).start();

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top