2010-06-28 11 views
5

Bir programdan bir komut yürütmem gerekiyor. Komut satırı tamam, terminalde denedim ama programda çalışmıyor.Runtime.getRuntime() ile yönlendirme. Exec() çalışmıyor

benim kodundan bir kopyasını ekleyin:

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

bir klasör (dosya adı) tüm dosyaların adını almak ve bir .json bunları yazma, Postadölesan videoları meta ayıklamak gerekir programı 'metadata' klasöründeki dosyalar.
Sorun nerede?

+1

Bu arada - "işe yaramaz" demekten kaçının. Bu, herhangi bir bilgi vermez (bu durumda işe yaramış olsa da). Bunun yerine, bir şeylerin yanlış olduğunu düşündüğünüz çıktı/hata mesajlarını vermelisiniz. Gerekirse, * beklediğinizin * ne olacağını ve neyin gerçekte olduğunu (neyin farklı olduklarını vurgulayarak) netleştirmelisiniz. –

cevap

12

Sorun şu ki, yeniden yönlendirme karakteri (>) bir kabuk tabanlı yapı, çalıştırılamıyor değil. Yani, bu komutu bash (ki siz değilsiniz) gibi bir şeyle çalıştırıyorsanız, exiftool çağrıcınız için bir literal karakter argümanı olarak yorumlanacaktır. - bash -c argüman olarak bütün komut satırı geçmesi

  1. bunu yapmak için bash alın: İşe bu almak istiyorsanız

    , iki seçeneğiniz vardır. Durumunuzda iyi görünüyor olsa da, bu bazı kahramanca kaçış gerekebilir.

  2. Yönlendirmeyi kendiniz Java içinde yapın. Yeniden yönlendirilmiş çıktı (yani, > işaretine kadar olan her şey) komutunu kullanarak komutu çağırınız, daha sonra işlemin çıkışından okuyarak tüm içeriği uygun dosyaya yazınız.

ikinci yaklaşım bunun üzerine aslında çok az ekstra var, başlangıçta fazla iş gibi geliyor, ama sen ihtiyaç her zaman Süreci çıktı okumayı göz önüne aldığımızda zaten (javadocs, ikinci paragraf bakınız) . Bu çıkışı basitçe atmak yerine bir dosyaya gönderiyorsunuz.

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

Bu altında "çözüm 2" düşer, ancak çalışma zamanı kitaplığı Demirbaş ilgilenir: Java 7 varsa

+3

'Runtime.exec' ile ilgili sorunlar için genel bir referans olarak, antik, ama yine de çok uygun bir makaleyi öneririm [When Runtime.exec() olmaz] (http://www.javaworld.com/jw-12-2000 /jw-1229-traps.html). –