2010-06-28 16 views
5

Ho bisogno di eseguire un comando da un programma. La riga di comando è ok, l'ho provata nel terminale, ma non funziona nel programma.Reindirizzamento con Runtime.getRuntime(). Exec() non funziona

aggiungo una copia dal mio codice:

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

Il programma deve ottenere il nome di tutti i file in una cartella (nome del file) ed estrarre i metadati di video theese, li scrivendo su un .json file nella cartella "metadati".
Dov'è il problema?

+1

A proposito - evitare di dire "non funziona". Questo non fornisce a nessuno alcuna informazione su cui andare avanti (anche se in questo caso ha funzionato). Invece, dovresti dare i messaggi di output/errore che ti hanno fatto pensare che qualcosa non andasse. Se necessario, dovresti anche chiarire che cosa * ti aspetti * che accada, e che cosa * effettivamente * sia successo (evidenziando dove erano diversi). –

risposta

12

Il problema è che il carattere di reindirizzamento (>) è un costrutto basato su shell, non un file eseguibile. Quindi, a meno che tu non stia eseguendo questo comando con qualcosa come bash (che non sei), verrà interpretato come argomento letterale per la tua invocazione exiftool.

Se si desidera ottenere questo lavoro, si hanno due opzioni:

  1. Get bash per farlo - passare l'intera linea di comando come argomento di bash -c. Questo potrebbe richiedere qualche fuga eroica, anche se nel tuo caso sembra OK.
  2. Effettua il reindirizzamento autonomamente in Java. Richiamare il comando senza l'output reindirizzato (ovvero fino al segno >), quindi leggere dal processo 'outputstream e scrivere tutto il contenuto nel file appropriato.

Quest'ultimo approccio suona come più lavoro inizialmente, ma se si considera che si bisogno di leggere sempre un uscita di processo comunque (vedere la javadocs, secondo comma), è in realtà molto poco in più per di più . Stai semplicemente inviando questo output a un file invece di buttarlo via.

+3

Come riferimento generale ai problemi relativi a 'Runtime.exec' suggerisco l'articolo antico, ma ancora molto appropriato [Quando Runtime.exec() non lo farà] (http://www.javaworld.com/jw-12-2000 /jw-1229-traps.html). –

3

Se si dispone di Java 7, è più facile:

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

questo rientra "soluzione 2", ma la libreria di runtime si prende cura del boilerplate.

Problemi correlati