0

在 JAVA 中使用 ProcessBuilder 我可以运行简单的终端命令,如 ls、pwd、echo 等。但是下面的代码正在终止,不知道为什么?

public static void main(String[] args) throws Exception
{
    Runtime r = Runtime.getRuntime();
    Process p = r.exec("echo 'T W O N E I G H T' | /home/saj/g2p/mosesdecoder-master/bin/moses -f /home/saj/g2p/working/binarised-model/moses.ini");
    p.waitFor();

    BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = "";
    while ((line = b.readLine()) != null) 
    {
      System.out.println(line);
    } 
}

此命令在终端上运行良好,大约需要 15 秒才能运行并提供输出。我在 stackoverflow 上浏览过类似的主题,但没有找到任何帮助。请在这方面提供帮助。提前致谢。

4

2 回答 2

2

请参考此代码,这可能会对您有所帮助....使用 bash。只需将您的命令替换为 echo 命令

ProcessBuilder b = new ProcessBuilder("bash","-c","echo abc");

    Process termProc = null;

    try {
        termProc = b.start();
        BufferedReader stdInput = new BufferedReader(new 
        InputStreamReader(termProc.getInputStream()));
        BufferedReader stdError = new BufferedReader(new 
        InputStreamReader(termProc.getErrorStream()));

        String s = null;
        while ((s = stdInput.readLine()) != null) 
        {
            System.out.println(s);


         }
        while ((s = stdError.readLine()) != null) 
        {

            System.out.println(s);

        }

    } catch (IOException e) {

        e.printStackTrace();
    }
于 2013-03-05T05:46:24.003 回答
0

考虑同时监控 InputStream 和 ErrorStream。输出可能会写入 ErrorStream,这就是为什么您看不到任何显示的原因。

这是来自 Javaworld 的一个很好的例子,它介绍了 Runtime.exec() 的一些常见缺陷以及如何使用它。


我在第一次查看您的代码时错过了它,但这里提示您可能做错了什么:

由于一些原生平台只为标准输入输出流提供有限的缓冲区大小,未能及时写入子进程的输入流或读取输出流可能会导致子进程阻塞,甚至死锁。

考虑按照以下方式更新您的代码:

public static void main(String[] args) throws Exception
{
    Runtime r = Runtime.getRuntime();
    Process p = r.exec("echo 'T W O N E I G H T' | /home/saj/g2p/mosesdecoder-master/bin/moses -f /home/saj/g2p/working/binarised-model/moses.ini");

    BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = "";
    while ((line = b.readLine()) != null) 
    {
      System.out.println(line);
    } 

    BufferedReader b = new BufferedReader(new InputStreamReader(p.getErrorStream()));
    String line = "";
    while ((line = b.readLine()) != null) 
    {
      System.out.println(line);
    } 

    p.waitFor();
}

注意:我建议创建线程来处理显示来自输入流和错误流的输出,如我在上面发布的示例链接中所示。

于 2012-12-10T06:43:17.733 回答