Перенаправление с 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");
    }

Программа должна получить название всех файлов в папке (имя файла) и извлечь метаданные этих видео, пишущий им на .json файлы в папке 'метаданные'.
Где проблема?

6
задан Joachim Sauer 19 October 2012 в 10:53
поделиться

1 ответ

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

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

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

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

13
ответ дан 8 December 2019 в 14:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: