2012-08-23 171 views
0

可能重複:
How to make pipes work with Runtime.exec()?的Java EXEC linux命令

你好,我使用exec命令寫了簡單的Java功能。這個函數檢查系統中是否存在字體(linux)。首先,我寫了簡單的bash命令:identify -list font | grep -i 'Font: Times-Bold' -w其完美的工作,所以我創建簡單的程序:

public abstract class SystemReader{ 

    public static final void checkFontExist(String name){ 
      String command = "identify -list font | grep -i -w \'Font: " + name + "\'"; 
      Process p =Runtime.getRuntime().exec(command); 

      String lines = ""; 
      String resoults =""; 
      BufferedReader bufferedReader = new BufferedReader(new  InputStreamReader(p.getInputStream())); 
      while((line buferedReader.readLine())!=null){ 
        resoult += line + "\n"; 
      } 

      System.out.println("RESPONSE: " + resoult); 
      bufferreader.close(); 
    } 

}

其工作,但不是我espect。該函數返回我係統中存在的所有字體。 它似乎命令grep不是可執行文件?

我嘗試使用EXEC命令的另一個版本()我創造:

String command = {"identify -list font", "grep -i -w \'Font: " + fontName + "\'"} 

,但我有錯誤:

Exception in thread "main" java.io.IOException: Cannot run program "identify -list font ": java.io.IOException: error=2, No such file or directory 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:460) 
    at java.lang.Runtime.exec(Runtime.java:593) 
    at java.lang.Runtime.exec(Runtime.java:466) 

你能不能給我建議什麼是錯的?非常感謝

+0

管道系統由外殼提供,因此您需要手動將一個命令的結果傳遞給另一個命令。 – ranman

回答

6
String[] cmd = { 
    "/bin/sh", 
    "-c", 
    "identify -list font | grep -i -w \'Font: " + name + "\'" 
}; 

Process p = Runtime.getRuntime().exec(cmd); 

將通過shell傳遞命令。自從|之後,你就需要這些(管道)命令由shell而不是操作系統提供。