簡體   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