2013-05-22 70 views
5

Tôi cần thực thi lệnh trong chương trình java của mình nhưng sau khi thực thi lệnh, nó yêu cầu tham số khác (mật khẩu trong trường hợp của tôi). làm thế nào tôi có thể quản lý quá trình đầu ra của Runtime.getRuntime().exec() để chấp nhận tham số để thực hiện thêm?Gửi tham số đến Runtime.getRuntime(). Exec() Sau khi thực hiện

Tôi đã thử new BufferedWriter(new OutputStreamWriter(signingProcess.getOutputStream())).write("123456"); nhưng nó không hoạt động.

+0

tôi đã cố gắng BufferedWriter mới (OutputStreamWriter mới (signingProcess.getOutputStream())). Viết ("123456") nhưng không làm việc. –

Trả lời

5

Liệu chương trình của bạn không được trang bị tùy chọn --password? Thông thường, tất cả các chương trình dựa trên dòng lệnh đều làm chủ yếu cho các tập lệnh.

Runtime.getRuntime().exec(new String[]{"your-program", "--password="+pwd, "some-more-options"}); 

Hoặc cách phức tạp hơn và nhiều hơn nữa dễ bị lỗi:

try { 
    final Process process = Runtime.getRuntime().exec(
      new String[] { "your-program", "some-more-parameters" }); 
    if (process != null) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        DataInputStream in = new DataInputStream(
          process.getInputStream()); 
        BufferedReader br = new BufferedReader(
          new InputStreamReader(in)); 
        String line; 
        while ((line = br.readLine()) != null) { 
         // handle input here ... -> 
         // if(line.equals("Enter Password:")) { ... } 
        } 
        in.close(); 
       } catch (Exception e) { 
        // handle exception here ... 
       } 
      } 
     }).start(); 
    } 
    process.waitFor(); 
    if (process.exitValue() == 0) { 
     // process exited ... 
    } else { 
     // process failed ... 
    } 
} catch (Exception ex) { 
    // handle exception 
} 

mẫu này mở ra một chủ đề mới (lưu ý đồng thời và đồng bộ hóa) đó là sẽ đọc đầu ra của quá trình của bạn. Tương tự, bạn có thể cấp dữ liệu cho quy trình của mình với đầu vào miễn là nó chưa chấm dứt:

if (process != null) { 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      try { 
       DataOutputStream out = new DataOutputStream(
         process.getOutputStream()); 
       BufferedWriter bw = new BufferedWriter(
         new OutputStreamWriter(out)); 
       bw.write("feed your process with data ..."); 
       bw.write("feed your process with data ..."); 
       out.close(); 
      } catch (Exception e) { 
       // handle exception here ... 
      } 
     } 
    }).start(); 
} 

Hy vọng điều này sẽ hữu ích.

+0

có bạn là đúng, tôi hoàn toàn quên nó :)) –

+0

Nhưng nếu có một tùy chọn khác sau khi thực hiện tôi sẽ hài lòng hơn: D –

+1

chắc chắn, có một cách phức tạp hơn để làm điều đó sau khi bị truy tố -> Tôi sẽ mở rộng câu trả lời của tôi. – salocinx

1

Bạn nên cung cấp trong tham số cửa sổ của bạn chỉ huy nếu bạn làm việc trên cửa sổ

chuyến thăm liên kết này để biết thêm chi tiết: http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html

+1

Câu hỏi đặt ra là hỏi về việc cung cấp dữ liệu cho một tiến trình ** sau khi ** nó bắt đầu thực hiện, không phải là tham số dòng lệnh. – Dukeling

+0

bạn muốn làm gì? – devosJava

+1

@Dukeling: mật khẩu gần như có thể được chuyển thành tham số. – salocinx

2
Runtime r=Runtime.getRuntime(); 
process p=r.exec("your string"); 

thử cách này

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