【问题标题】:Java running bash command while feeding it input and getting outputJava 在输入并获取输出时运行 bash 命令
【发布时间】:2012-03-28 12:45:13
【问题描述】:

我必须写下一些运行外部进程的 java 代码。 此过程从标准输入获取输入行,并在标准输出上提供输出行。

我写的代码如下

try
{            
    Runtime rt = Runtime.getRuntime();
    Process proc = rt.exec("./" + args[0]);
    Process proc2 = rt.exec(c);
    int exitVal = proc2.exitValue();
    System.out.println("Process exitValue: " + exitVal);
} 
catch (Throwable t){
}

args[0] 是外部进程,c 是我需要提供给进程的输入(字符串)。如果它运行正确,我会得到一个 exitVal=0,而我什么也得不到。此外,我真正想要打印的是外部进程的输出(在给定示例中为“6”)。

【问题讨论】:

标签: java process execute


【解决方案1】:

您必须在进程上使用getInputStream()getOutputStream() 进行通信,请参阅javadocs

如果你没有从进程中读取所有数据,它可能会挂起甚至死锁。有关常见问题的简短介绍,请参阅this blog post。至少,您应该从流程输出中读取所有数据。

【讨论】:

    【解决方案2】:

    你不能“一无所获”。方法exitValue() 返回原始类型,因此它甚至不能为空。但是这种方法可能会卡住。发生这种情况是因为您的进程仍在运行。

    它是否可能因为您没有“喂”它而正在运行?在这种情况下,您唯一需要做的就是调用proc2.getOutputStream() 并将您需要的内容写入此流。如果您想读取进程的输出,请使用proc2.getInputStream() 并从流中读取。

    顺便说一句,看看ProcessBuilder。它提供了比简单的Runtime.exec() 更好、更“面向对象”的API。

    【讨论】:

    • 感谢您的回复!使用ProcessBuilder仍然没有成功:/问题仍然存在......可执行文件的工作方式是:你运行它(Enter)然后它等待一个字符串(你输入字符串-> Enter)..它基本上是一个进程,我只需要一种方法让这个进程知道它正在等待一个标准输入。
    【解决方案3】:

    您可以使用“

    {
      Process p = Runtime.getRuntime().exec("wc < pom.xml");
      p.waitFor();
      System.out.println(p.exitValue());
      BufferedReader bri = new BufferedReader
        (new InputStreamReader(p.getInputStream()));
      String line;
      while ((line = bri.readLine()) != null) {
        System.out.println(line);
      }
      bri.close();
    }
    

    【讨论】:

    • 感谢您的回复!事情是我不想给我的可执行文件提供一个文件,而是一个字符串。
    猜你喜欢
    • 2015-06-19
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-01
    • 2020-01-06
    • 2011-05-21
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多