开始与继承标准输入/输出Java 6中

问题描述:

/标准错误的过程。如果我开始通过Java的ProcessBuilder类的过程,我有充分的机会来在这一过程中的标准,标准出来,如Java InputStreamsOutputStreams标准错误流。但是,我找不到将这些流无缝连接到System.in,System.outSystem.err的方法。开始与继承标准输入/输出Java 6中

它可以使用redirectErrorStream()获取包含子进程的标准出单InputStream和标准错误,并通过刚刚循环,并通过我的标准把它发送出去,但我不能找到一个方法来做到这一点,让用户键入流程,如果我使用C system()呼叫,他/她可以。

在Java SE 7出现时,这似乎是可行的 - 我只是想知道现在是否有解决方法。如果子进程中的isatty()的结果进行重定向,则为积分。

+0

对不起,我忍不住。 – jjnguy 2008-09-13 04:33:04

+0

没问题。 (顺便说一句,我不是那个低头赞扬你的人。) – 2008-09-13 04:35:08

+0

恩,好吧,谢谢那个不赞成我的人。谢谢你,约翰不要低估我。 – jjnguy 2008-09-13 04:37:54

您需要将Process out,err和输入流复制到系统版本。最简单的方法是使用Commons IO软件包中的IOUtils类。 copy method看起来是你所需要的。复制方法调用将需要位于不同的线程中。

这是基本的代码:

// 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(); 

,编译,并且不要求您使用共享IO约翰的回答变化:

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(); 
} 

对于System.in使用以下pipein(),而不是pipe()

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

执行:

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(); 

}