2010-06-28 41 views
5

Tôi cần thực thi lệnh từ chương trình. Dòng lệnh là ok, tôi đã thử nó trong terminal, nhưng nó không hoạt động trong chương trình.Chuyển hướng bằng Runtime.getRuntime(). Exec() không hoạt động

tôi thêm một bản sao từ mã của tôi:

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

Chương trình phải có được tên của tất cả các tập tin trong một thư mục (filename) và trích xuất các siêu dữ liệu của video theese, writting chúng trên một .json các tệp trong thư mục 'siêu dữ liệu'.
Sự cố ở đâu?

+1

Nhân tiện - tránh nói "nó không hoạt động". Điều này không cung cấp cho bất kỳ ai thông tin để tiếp tục (mặc dù trong trường hợp này nó đã làm việc ra). Thay vào đó, bạn nên cung cấp cho các thông báo đầu ra/lỗi bạn nhận được mà làm cho bạn nghĩ rằng một cái gì đó đã sai. Nếu cần thiết, bạn cũng nên làm rõ những gì bạn mong đợi * xảy ra, và những gì * thực sự * đã xảy ra (làm nổi bật nơi chúng khác nhau). –

Trả lời

12

Vấn đề là, ký tự chuyển hướng (>) là cấu trúc dựa trên vỏ, không phải là một tệp thực thi. Vì vậy, trừ khi bạn đang chạy lệnh này thông qua một cái gì đó như bash (mà bạn không), nó sẽ được hiểu là một đối số ký tự chữ cho lời gọi exiftool của bạn.

Nếu bạn muốn được điều này để làm việc, bạn có hai lựa chọn:

  1. Nhận bash để làm điều đó - vượt qua dòng lệnh toàn như một cuộc tranh cãi để bash -c. Điều này có thể cần một số anh hùng thoát, mặc dù trong trường hợp của bạn có vẻ OK.
  2. Tự chuyển hướng trong Java. Gọi lệnh mà không có đầu ra được chuyển hướng (tức là mọi thứ đến ký hiệu >), sau đó đọc từ dòng đầu ra của quá trình và ghi tất cả nội dung vào tệp thích hợp.

Cách tiếp cận thứ hai có vẻ như làm việc nhiều hơn ban đầu, nhưng khi bạn xem xét rằng bạn cần phải luôn luôn đọc một Process' đầu ra nào (xem javadocs, đoạn thứ hai), nó thực sự rất little extra trên hết . Bạn chỉ đơn giản là gửi đầu ra này vào một tập tin thay vì ném nó đi.

+3

Là một tham chiếu chung cho các vấn đề liên quan đến 'Runtime.exec', tôi gợi ý bài viết cổ, nhưng vẫn rất phù hợp [Khi Runtime.exec() sẽ không] (http://www.javaworld.com/jw-12-2000 /jw-1229-traps.html). –

3

Nếu bạn có Java 7, thật dễ dàng:

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

này thuộc "giải pháp 2", nhưng thư viện runtime sẽ chăm sóc của các soạn sẵn.

Các vấn đề liên quan