2010-06-28 70 views
5

我需要從程序執行命令。命令行是好的,我在終端上試過了,但它在程序中不起作用。使用Runtime.getRuntime()重定向。exec()不起作用

我從我的代碼添加副本:

File dir = new File("videos"); 
    String[] children = dir.list(); 
    if (children == null) { 
    // Either dir does not exist or is not a directory 
    System.out.print("No existe el directorio\n"); 
    } else { 
    for (int i=0; i<children.length; i++) { 
    // Get filename of file or directory 
    String filename = children[i]; 

    //Recojo el momento exacto 
    System.out.print("\n" +filename); 

    Process p = Runtime.getRuntime().exec("exiftool -a -u -g1 -j videos/"+filename+">metadata/"+filename+".json"); 
    } 

程序必須得到所有文件名中的一個文件夾(文件名)和提取theese視頻元數據,其中書面方式上以.json文件夾'元數據'中的文件。
問題在哪裏?

+1

順便說一句 - 避免說「它不起作用」。這並沒有給任何人提供任何信息(儘管在這種情況下它已經解決了)。相反,你應該給出你得到的輸出/錯誤信息,這讓你認爲出了問題。如果有必要,你還應該澄清你*預期會發生什麼,以及發生了什麼*實際發生(突出顯示它們的不同之處)。 – 2010-06-28 08:07:20

回答

12

問題是,重定向字符(>)是一個基於shell的構造,而不是的可執行文件。所以除非你通過像bash這樣的命令來運行這個命令(它不是),它將被解釋爲你的exiftool調用的文字字符參數。

如果你想要得到這個工作,你有兩個選擇:

  1. 獲取慶典做 - 傳遞整個命令行參數來bash -c。這可能需要一些英雄逃跑,雖然在你的情況下它看起來不錯。
  2. 在Java中自己進行重定向。在沒有重定向輸出的情況下調用該命令(即,所有內容均符合>符號),然後從流程的輸出流中讀取並將所有內容寫入相應的文件。

後者的做法聽起來似乎更多的工作開始,但是當你認爲你需要經常閱讀一個進程的輸出反正(見javadocs,第二段),它實際上是非常少的額外最重要的是。您只需將此輸出發送到文件而不是將其丟棄。

+3

作爲一個'Runtime.exec'相關問題的一般參考,我建議古代,但仍然非常合適的文章[當Runtime.exec()不會](http://www.javaworld.com/jw-12-2000 /jw-1229-traps.html)。 – 2012-10-19 10:55:00

3

如果你有Java 7中,它更容易:

Process p = new ProcessBuilder() 
    .command("exiftool", "-a", "-u", "-g1", "-j", 
      new File("videos", filename).toString()) 
    .redirectOutput(new File("metadata", filename + ".json")) 
    .start(); 

這符合「解決方案2」,但運行時庫取樣板的照顧。