Перенаправление с помощью 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; imetadata/"+filename+".json"); } 

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

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

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

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

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

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

  • Запуск java-программы из другой java-программы
  • читать вывод из java exec
  • Печать Runtime exec () OutputStream для консоли
  • Разница между ProcessBuilder и Runtime.exec ()
  • Java Runtime.getRuntime (). Exec () альтернативы
  • Чтение streamов из java Runtime.exec
  • Как заставить трубы работать с Runtime.exec ()?
  • Метод exec () Runtime не перенаправляет вывод
  • Выполнение внешней программы в java
  • Давайте будем гением компьютера.