Перенаправление с Runtime.getRuntime (). Exec () не работает - PullRequest
6 голосов
/ 28 июня 2010

Мне нужно выполнить команду из программы.Командная строка в порядке, я попробовал это в терминале, но это не работает в программе.

Я добавляю копию из своего кода:

  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 в папке «метаданные».
Где проблема?

Ответы [ 2 ]

13 голосов
/ 28 июня 2010

Проблема в том, что символ перенаправления (>) представляет собой конструкцию на основе оболочки, не исполняемый файл. Так что, если вы не выполните эту команду через что-то вроде bash (а это не так), она будет интерпретироваться как буквенный символьный аргумент для вашего вызова exiftool.

Если вы хотите, чтобы это сработало, у вас есть два варианта:

  1. Получить bash, чтобы сделать это - передать всю командную строку в качестве аргумента bash -c. Это может потребовать некоторого героического побега, хотя в вашем случае все выглядит хорошо.
  2. Выполните перенаправление самостоятельно в Java. Вызвать команду без перенаправленного вывода (т. Е. Все до знака >), затем прочитать из выходного потока процесса и записать все содержимое в соответствующий файл.

Последний подход поначалу звучит как большая работа, но если учесть, что вам необходимо всегда читать вывод процесса (см. javadocs , второй абзац), это на самом деле очень мало дополнительно к этому. Вы просто отправляете этот вывод в файл, а не выбрасываете его.

3 голосов
/ 24 октября 2013

Если у вас есть 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», но библиотека времени выполнения заботится о шаблоне.

...