2010-06-03 43 views
7

Tôi có một UNIX thực thi bản địa đòi hỏi các đối số được cho ăn ở nhưProcess đòi hỏi phải chuyển hướng đầu vào

prog.exe < foo.txt này.

foo.txt có hai dòng: thanh baz

Tôi đang sử dụng java.lang.ProcessBuilder để thực hiện lệnh này. Thật không may, prog.exe sẽ chỉ làm việc bằng cách sử dụng chuyển hướng từ một tập tin. Có cách nào tôi có thể bắt chước hành vi này trong Java?

Tất nhiên,

ProcessBuilder pb = new ProcessBuilder("prog.exe", "bar", "baz"); 

không hoạt động.

Cảm ơn!

Trả lời

8
ProcessBuilder pb = new ProcessBuilder("prog.exe"); 
Process p = pb.start(); 
OutputStream pos = p.getOutputStream(); 

InputStream fis = new FileInputStream("file.txt"); 
byte[] buffer = new byte[1024]; 
int read = 0; 
while((read = fis.read(buffer)) != -1) { 
    pos.write(buffer, 0, read); 
} 
fis.close(); 

Không được thử nghiệm, nhưng một cái gì đó như thế này sẽ làm việc.

+0

Trong trường hợp của tôi (JDK 6), tôi đã phải sử dụng hàm tạo InputStream nhận một Tệp. Chuỗi với đường dẫn đã không làm việc cho tôi. Cảm ơn Marc. Ví dụ: InputStream fis = new FileInputStream (tệp mới ("/ Path/to/file.txt")); – tremendows

0

Bạn đã cố gắng bọc prog.exe vào tập lệnh chấp nhận đối số và xử lý prog.exe? Tôi cho rằng bạn đang sử dụng một trình bao, vì vậy nó khá đơn giản để thiết lập một tập lệnh bash.

Nếu tôi hiểu vấn đề của bạn, kịch bản sẽ như thế nào:

#!/usr/bin/bash 
echo $1 > file 
echo $2 >> file 
prog.exe < file 
remove file 
+0

Điều đó sẽ ổn nhưng điểm này là chuyển từ UNIX sang Windows. Vì vậy, tôi sẽ không có một vỏ trên nền tảng mới. – initialZero

1

Việc chuyển hướng được thiết lập bằng vỏ bạn cần todo này bằng tay, một cái gì đó như thế:

Process proc = pb.start(); 
OutputStreamWriter os = new OutputStreamWriter(proc.getOutputStream()); 
// then write the data from your file to os 
// ... 
os.close(); 
0

Xây dựng quy trình bằng cách sử dụng ProcessBuilder, sau đó sử dụng process.getOutputStream() để có được OutputStream sẽ dẫn đến đầu vào chuẩn của quy trình.

Mở tệp bằng kỹ thuật Java thông thường, đọc nội dung của tệp và viết nó vào số OutputStream chuyển đến Quy trình bạn đã thực hiện với ProcessBuilder.

Vấn đề bạn có ngay bây giờ là bạn đang gọi ProcessBuilder để khởi động

$ prog.exe foo bar 

Mà có lẽ không có gì gần với những gì bạn muốn đạt được.

2

Tôi đã kết thúc thực hiện một việc như thế này và hoạt động. Cảm ơn vì sự giúp đỡ!

import java.io.BufferedWriter; 
    import java.io.BufferedReader; 
    import java.io.IOException; 
    import java.io.OutputStream; 
    import java.io.InputStream; 
    import java.io.InputStreamReader; 
    import java.io.OutputStreamWriter; 
    import java.io.PrintWriter; 
    import java.util.LinkedList; 
    import java.util.List; 

    public class UserInp { 

     public static void main(String[] args) { 
      new UserInp().sample(); 
     } 

     public void sample() { 

      String command = "foo.exe"; 

      List<String> args = new LinkedList<String>(); 

      args.add("bar"); 
      args.add("baz"); 

      ProcessBuilder pb = new ProcessBuilder(command); 
      java.lang.Process process = null; 

      try { 
       process = pb.start(); 
      } catch (IOException ex) { 
       //-- 
      } 
      OutputStream os = process.getOutputStream(); 
      PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(os))); 

      final InputStream is = process.getInputStream(); 
      new Thread(new Runnable() { 
       public void run() { 
        try { 
         BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
         String line; 
         while ((line = br.readLine()) != null) { 
          System.out.println(line); 
         } 
        } catch (java.io.IOException e) { 
        } 
       } 
      }).start(); 

      for (String arg : args) { 
       pw.println(arg); 
      } 

      pw.close(); 

      int returnCode = -1; 
      try { 
       returnCode = process.waitFor(); 
      } catch (InterruptedException ex) { 
       //-- 
      } 
      System.out.println(returnCode); 
     } 
    } 
Các vấn đề liên quan