Я должен выполнить команду из программы. Командная строка в порядке, я попробовал ее в терминале, но она не работает в программе.
Я добавляю копию со своего кода:
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 файлы в папке 'метаданные'.
Где проблема?
Проблема в том, что символ перенаправления (>
) является конструкцией на основе оболочки, а не исполняемым файлом. Поэтому, если вы не запускаете эту команду через что-то вроде bash
(а это не так), она будет интерпретироваться как буквальный символьный аргумент для вашего вызова exiftool
.
Если вы хотите, чтобы это работало, у вас есть два варианта:
bash -c
. Это может потребовать некоторого героического побега, хотя в вашем случае это выглядит нормально. >
), затем прочтите из потока вывода процесса и запишите все содержимое в соответствующий файл. Второй подход поначалу кажется более трудоемким, но если учесть, что вам все равно нужно всегда читать вывод процесса (см. javadocs , второй абзац), то на самом деле это очень немного лишнего. Вы просто отправляете этот вывод в файл, а не выбрасываете его.