无法从java程序(Eclipse)运行特定的终端命令

时间:2012-12-10 06:33:19

标签: java eclipse ubuntu exec processbuilder

在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上经历了类似的主题,但没有找到任何帮助。 请帮忙。 提前谢谢。

2 个答案:

答案 0 :(得分: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();
    }

答案 1 :(得分:0)

考虑监控InputStream和ErrorStream。有可能输出可能被写入ErrorStream,这就是为什么你没有看到任何显示的东西。

来自Javaworld的

Here's a good example关于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();
}

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