【问题标题】:Concise way of capturing the output of process in Java在Java中捕获进程输出的简洁方法
【发布时间】:2016-02-07 00:13:14
【问题描述】:

为了在 Groovy 中捕获进程的输出,我使用以下命令:

"command".execute().text

我想在 Java 中做同样的事情,但我发现的所有响应都包含大量涉及循环的样板代码,BufferedReaderScanner 等:

我可以在 1-2 行代码内做同样的事情吗?也许 Guava 或 Apache 可以让生活变得更简单?

【问题讨论】:

  • Java 大致相当于样板代码。在这种情况下,可能有一个库(可能是)会有所帮助,但大部分 Java 将是样板文件。我很确定你可以在 like 中做到这一点。 . .不过 5-10 行。
  • Apache Commons Exec,没用过,不知道好不好用。这是一个很少出现的问题,可能不值得。几年前我编写了自己的十行流程运行程序,从那以后我一直很高兴地使用它。
  • 如果您可以访问项目中的 groovy jar,则可以调用 getText() 并获得相同的结果
  • @CollinD 这里的事情是我需要在一个单元测试中使用它一次,所以这 5-10 行将不仅仅是一个测试本身。

标签: java


【解决方案1】:

我设法想出了以下两条线:

Process process = Runtime.getRuntime().exec("command")'
String output = IOUtils.toString(process.getInputStream());

【讨论】:

  • 如果你的进程使用stderr,你可以阻塞
  • @JérémieB 你能解释一下那个场景吗? “你可以阻止”是什么意思?
  • 您是说 process.getOutputStream() 吗?你的问题是如何捕获输出。
  • 如果进程写入错误流,而您没有读取它,则标准缓冲区将满,进程将阻塞等待此缓冲区中的一些空间。因此,您的代码将阻塞,等待进程终止。流程的流必须是“泵送的”。
  • 你有没有仔细看 IOUtils 上的 toString(),toString() 采用 InputStream,我没有看到任何采用“OutputStream”的方法
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 2019-07-09
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多