当前位置:  开发笔记 > 编程语言 > 正文

在Java 6中使用继承的stdin/stdout/stderr启动进程

如何解决《在Java6中使用继承的stdin/stdout/stderr启动进程》经验,为你挑选了2个好方法。

如果我通过Java的ProcessBuilder类启动一个进程,我可以完全访问该进程的标准输入,标准输出和标准错误流,如Java InputStreamsOutputStreams.不过,我不能找到一种方法,这些流无缝连接System.in,System.outSystem.err.

可以用来redirectErrorStream()获取InputStream包含子进程的标准输出和标准错误的单个,然后循环遍历并通过我的标准输出 - 但是我找不到这样做的方法并让用户键入进程,如果我使用C system()调用他或她可以.

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



1> John Meagher..:

您需要将Process out,err和输入流复制到System版本.最简单的方法是使用Commons IO软件包中的IOUtils类.该复制方法看起来是你需要的.复制方法调用需要在单独的线程中.

这是基本代码:

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


不完全的.IOUtils.copy将InputStream作为它的第一个参数,因此不适用于getOutputStream.所以它是IOUtils.copy(process.getInputStream(),System.out); 这有点令人困惑,因为getOutputStream实际上管道输入进程.

2> Eelco..:

John的答案的变体,编译并且不要求您使用Commons 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();
}

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有