2010-06-28 17 views
5

Necesito ejecutar un comando desde un programa. La línea de comandos está bien, lo intenté en la terminal, pero no funciona en el programa.Redirección con Runtime.getRuntime(). Exec() no funciona

agrego una copia de mi código:

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"); 
    } 

El programa debe obtener el nombre de todos los archivos en una carpeta (nombre de archivo) y extraer los metadatos de vídeos theese, escribiendo sobre una .json archivos en la carpeta 'metadata'.
¿Dónde está el problema?

+1

Por cierto, evite decir "no funciona". Esto no le da a nadie ninguna información para seguir (aunque en este caso funcionó). En su lugar, debe dar los mensajes de salida/error que obtuvo que le hicieron pensar que algo andaba mal. Si es necesario, también debe aclarar qué * esperó * que suceda, y qué sucedió * realmente (resaltando dónde eran diferentes). –

Respuesta

12

El problema es que el carácter de redirección (>) es una construcción basada en shell, no un ejecutable. Entonces, a menos que esté ejecutando este comando a través de algo como bash (que no es), se interpretará como un argumento de carácter literal para su invocación exiftool.

Si usted quiere conseguir que esto funcione, usted tiene dos opciones:

  1. Consigue bash para hacerlo - pass toda la línea de comandos como argumento para bash -c. Esto podría necesitar un escape heroico, aunque en tu caso se ve bien.
  2. Haga la redirección usted mismo dentro de Java. Invoque el comando sin la salida redirigida (es decir, todo hasta el signo >), luego lea desde el tren de salida del proceso y escriba todos los contenidos en el archivo apropiado.

El último enfoque parece más trabajo al principio, pero si tenemos en cuenta que necesidad de leer siempre una salida de proceso de todos modos (ver la javadocs, segundo párrafo), en realidad es muy poco más en la parte superior de esa . Simplemente está enviando esta salida a un archivo en lugar de tirarlo.

+3

Como referencia general a los problemas relacionados con 'Runtime.exec', sugiero el artículo antiguo pero muy apropiado [Cuando Runtime.exec() no lo haga] (http://www.javaworld.com/jw-12-2000 /jw-1229-traps.html). –

3

Si tiene Java 7, es más fácil:

Process p = new ProcessBuilder() 
    .command("exiftool", "-a", "-u", "-g1", "-j", 
      new File("videos", filename).toString()) 
    .redirectOutput(new File("metadata", filename + ".json")) 
    .start(); 

Esto entra en "Solución 2", pero la biblioteca de tiempo de ejecución se encarga de la plancha de caldera.

Cuestiones relacionadas