java - Runtime.getRuntime()。exec()不起作用




process runtime.exec (2)

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

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

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

後面的方法聽起來像是最初的工作,但是當你認為你總是需要閱讀一個Process的輸出 (參見javadocs ,第二段)時,它實際上是非常小的。 你只是發送這個輸出到一個文件,而不是把它扔掉。

我需要從一個程序執行一個命令。 命令行是好的,我在終端上試了一下,但是在程序中不起作用。

我從我的代碼中添加一個副本:

  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");
    }

該程序必須獲取文件夾(文件名)中所有文件的名稱,並提取這些視頻的元數據,並將其寫在文件夾“元數據”中的.json文件中。
哪裡有問題?


如果你有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”,但運行時庫會照顧樣板。







io-redirection