当前位置: 首页 > 面试题库 >

使用Runtime.exec()生成的进程的有效执行和输出流重定向

冀望
2023-03-14
问题内容

我有一个脚本,可以多次执行一个程序,从而向STDERR和STDOUT产生约350行输出。现在,我需要使用Java执行脚本,从而将输出流打印到其原始目的地。因此,基本上,我从Java类内部执行脚本,从而维护了用户的原始行为。

我这样做的方式是受类似建议的启发,例如从java
Runtime.exec读取流,
并且在功能上工作正常。

Process p = Runtime.getRuntime().exec(cmdarray);
new Thread(new ProcessInputStreamHandler(p.getInputStream(), System.out)).start();
new Thread(new ProcessInputStreamHandler(p.getErrorStream(), System.err)).start();
return p.waitFor();

和类ProcessInputStreamHandler

class ProcessInputStreamHandler implements Runnable {
    private BufferedReader in_reader;
    private PrintStream out_stream;

    public ProcessInputStreamHandler(final InputStream in_stream, final PrintStream out_stream) {
        this.in_reader  = new BufferedReader(new InputStreamReader(in_stream));
        this.out_stream = out_stream;
    }

    @Override public void run() {
        String line;
        try {
            while ((line = in_reader.readLine()) != null) {
                out_stream.println(line);
            }
        } catch (Exception e) {throw new Error(e);}

        out_stream.flush();
    }
}

现在考虑我的问题陈述:虽然脚本的执行大约需要17秒,但是“封装的”执行至少需要21秒。这4秒钟或更多秒会在哪里丢失?

我已经尝试过使用ProcessBuilder带有STDERR重定向到STDOUT的POSIX
vfork和https://github.com/axiak/java_posix_spawn之类的库,使用字节缓冲区而不是BufferedReader…一切都没有任何积极结果。

有什么建议吗?我了解会有一些性能损失,但是4秒对我来说似乎有点多…

感谢任何建议!

最好的问候和在此先感谢。


问题答案:

完成任务的最快方法是使用Java 7和

return new ProcessBuilder(cmdarray).inheritIO().start().waitFor();

如果那没有帮助,我认为您无能为力,因为其他所有方法都会在您的运行时环境中添加更多必须处理的代码。



 类似资料:
  • 我不明白为什么它说“输出无效的ASCII文本”! 为了让你理解问题的背景,我发布了描述要做的事情。从这里开始! 在替换密码中,我们通过用另一个字母替换每个字母来“加密”(即以可逆的方式隐藏)消息。为此,我们使用一个密钥:在本例中,是字母表中每个字母到加密时对应的字母的映射。为了“解密”消息,消息的接收者需要知道密钥,这样他们就可以逆转这个过程:将加密文本(通常称为密文)转换回原始消息(通常称为明文

  • 问题内容: 我需要在Java中执行具有特定超时的外部批处理文件。这意味着,如果批处理执行的时间比指定的超时时间长,我需要取消执行。 这是我编写的示例代码: 批处理文件“ wait.bat”是这样的: 如您在代码中看到的,批处理文件将花费25秒完成(main方法的第一行),并且Timer将在5秒后销毁命令。 这是我的代码的输出: 如您在输出中看到的,最后一行(“ Really Done …”)在第5

  • 问题内容: 我有一个PhantomJS / CasperJS脚本,它是使用node.js脚本运行的。由于CasperJS不支持ing模块,因此我试图将CasperJS中的命令打印到,然后使用来从我的node.js脚本中读取它们,以执行将对象添加到redis / mongoose的操作(复杂,是的,但是看起来比为此设置Web服务更简单。。。)CasperJS脚本执行一系列命令,并创建例如20个屏幕截

  • 问题内容: 通常我会像这样启动一个命令 我知道您可以通过执行以下操作来重定向它 例如摆脱输出或 捕获输出。 但是我有时会忘记,并且想知道事实之后是否有办法捕获或重定向。 或类似的内容,这样我就可以继续使用终端,而不会在终端上弹出消息。 问题答案: 请参阅 从正在运行的进程重定向输出 。 首先,我在一个会话中运行命令,并测试将来自stdin的数据复制到文件中。然后在另一个会话中,我重定向输出。 首先

  • 问题内容: 我下面有以下代码示例。你可以在其中输入的命令,即回显结果。但是,先读后。其他输出流不起作用? 为什么会这样或我做错了什么?我的最终目标是创建一个线程计划任务,该任务定期执行对/ bash的命令,因此必须一前一后工作,而不能停止工作。我也一直在经历错误的任何想法? 谢谢。 问题答案: 首先,我建议更换生产线 与线 ProcessBuilder是Java 5中的新增功能,它使运行外部进程更

  • 问题内容: 我正在使用Jersey来实现RESTful API,该API主要是检索和提供JSON编码的数据。但是在某些情况下,我需要完成以下任务: 导出可下载的文档,例如PDF,XLS,ZIP或其他二进制文件。 检索多部分数据,例如一些JSON以及上载的XLS文件 我有一个基于页面的基于JQuery的Web客户端,该客户端创建对此Web服务的AJAX调用。目前,它不进行表单提交,而是使用GET和P