2010-06-28 5 views
5

Ich muss einen Befehl von einem Programm ausführen. Die Befehlszeile ist in Ordnung, ich habe es im Terminal versucht, aber es funktioniert nicht im Programm.Umleitung mit Runtime.getRuntime(). Exec() funktioniert nicht

ich hinzufügen, eine Kopie von meinem Code:

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

Das Programm muss den Namen aller Dateien in einem Ordner (Dateiname) und extrahieren Sie die Metadaten von theese Videos bekommen, so dass sie auf einem .json writting Dateien im Ordner 'Metadaten'.
Wo ist das Problem?

+1

Übrigens - vermeiden Sie zu sagen "es funktioniert nicht." Dies gibt niemandem Informationen weiter (obwohl es in diesem Fall geklappt hat). Stattdessen sollten Sie die ausgegebenen/Fehlermeldungen geben, die Sie glauben gemacht haben, dass etwas nicht in Ordnung war. Bei Bedarf sollten Sie auch klarstellen, was Sie * erwartet * haben und was * tatsächlich * passiert ist (Hervorhebung, wo sie anders waren). –

Antwort

12

Das Problem ist, das Umleitungszeichen (>) ist ein Shell-basierte Konstrukt, nicht eine ausführbare Datei. Wenn Sie also diesen Befehl nicht durch etwas wie bash ausführen (was nicht der Fall ist), wird er als Argument für das literale Zeichen für Ihren Aufruf exiftool interpretiert.

Wenn Sie diese erhalten möchten zu arbeiten, haben Sie zwei Möglichkeiten:

  1. bash Holen Sie es zu tun - passieren die ganze Befehlszeile als Argument an bash -c. Dies könnte einige heroische Flucht erfordern, obwohl es in deinem Fall OK aussieht.
  2. Führen Sie die Umleitung selbst in Java durch. Rufen Sie den Befehl ohne die umgeleitete Ausgabe (d. H. Alles bis zum Zeichen >) auf, lesen Sie dann aus dem Prozess 'outputstream und schreiben Sie den gesamten Inhalt in die entsprechende Datei.

Der letztere Ansatz klingt zunächst wie mehr Arbeit, aber wenn man bedenkt, dass Sie Notwendigkeit, immer ein Prozess Ausgang ohnehin zu lesen (siehe javadocs, zweiter Absatz), ist es obendrein eigentlich sehr wenig mehr ist . Sie senden diese Ausgabe einfach an eine Datei, anstatt sie wegzuwerfen.

+3

Als allgemeine Referenz zu 'Runtime.exec' bezogenen Problemen schlage ich den alten, aber immer noch sehr passenden Artikel vor [Wenn Runtime.exec() nicht wird] (http://www.javaworld.com/jw-12-2000 /jw-1229-traps.html). –

3

Wenn Sie Java 7, ist es einfacher:

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

Dies fällt unter „Lösung 2“, aber die Laufzeitbibliothek kümmert sich um den vorformulierten.