【问题标题】:Simplest way to get command output in java在java中获取命令输出的最简单方法
【发布时间】:2015-06-26 13:07:25
【问题描述】:

我知道您可以使用以下命令在 java 中为 linux 运行命令并从您刚刚运行的命令中获取输出。

Process p = Runtime.getRuntime().exec("host -t a " + domain);
p.waitFor();
StringBuffer sb = new StringBuffer();
BufferedReader reader = 
     new BufferedReader(new InputStreamReader(p.getInputStream()));

String line = "";           
while ((line = reader.readLine())!= null) {
sb.append(line + "\n");
}

然而,我想知道,有没有更简单的方法可以从运行的命令中获取输出?

【问题讨论】:

  • 我建议您在生成数据时阅读它。如果您的缓冲区已满,您的程序将停止等待您的阅读器,但是您要等到程序完成后才能阅读。
  • ProcessBuilder 有一些更简单的处理 IO 的方法。此外,您编写此代码的方式可能会阻止执行或丢失输出。您应该使用一个线程来读取输出,并且应该在调用 waitfor 之前设置该线程。
  • @PeterLawrey 所以请拨出Process.waitFor() 电话,对吗?
  • @jgr208 如果您想要退出代码,请将其移至末尾。顺便说一句,我不会使用 StringBuffer,因为它被 StringBuilder 取代了十年左右,并且不会以这种方式逐行读取输出。
  • @PeterLawrey 是的,这只是我抓取的一些示例代码。但至少很高兴我在将示例代码投入实际使用之前得到了这些建议。

标签: java linux output bufferedreader


【解决方案1】:

这是我使用的代码。它

  • 将错误和输出结合起来,因此如果出现错误,您仍然可以看到它。
  • 在数据生成时读取数据,因此缓冲区不会填满。
  • 不删除新行只是为了重新添加它们。

.

private static String run(String... cmds) throws IOException {
    ProcessBuilder pb = new ProcessBuilder(cmds);
    pb.redirectErrorStream(true);
    Process process = pb.start();
    StringWriter sw = new StringWriter();
    char[] chars = new char[1024];
    try (Reader r = new InputStreamReader(process.getInputStream())) {
        for (int len; (len = r.read(chars)) > 0; ) {
            sw.write(chars, 0, len);
        }
    }
    return sw.toString();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    • 2014-05-24
    相关资源
    最近更新 更多