繁体   English   中英

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

[英]Not able to run specific terminal commands from java program(Eclipse)

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

请参考此代码,这可能有助于你....使用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();
    }

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

以下是 Javaworld关于Runtime.exec()的一些常见缺陷以及如何使用它的一个很好的例子


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

由于某些本机平台仅为标准输入和输出流提供有限的缓冲区大小,因此无法及时写入输入流或读取子进程的输出流可能导致子进程阻塞甚至死锁。

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

 public static void main(String[] args) throws Exception { Runtime r = Runtime.getRuntime(); Process p = r.exec("echo 'TWONEIGHT' | /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的输出,如我在上面发布的示例链接中所示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM