2010-06-28 4 views
5

Мне нужно выполнить команду из программы. Командная строка в порядке, я попробовал ее в терминале, но она не работает в программе.Перенаправление с 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"); 
    } 

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

+1

Кстати, не говорите «это не работает». Это никому не дает информации (хотя в этом случае это сработало). Вместо этого вы должны предоставить сообщения о выходе/ошибке, которые заставили вас думать, что что-то не так. При необходимости вы также должны уточнить, что вы ожидали *, и что произошло * на самом деле (подчеркнув, где они были разные). –

ответ

12

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

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

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

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

+3

Как общая ссылка на связанные с Runtime.exec проблемы, я предлагаю древнюю, но все же очень подходящую статью [Когда Runtime.exec() не будет] (http://www.javaworld.com/jw-12-2000 /jw-1229-traps.html). –

3

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

Смежные вопросы