2010-06-03 64 views
7

予有需要這樣過程需要重定向輸入

prog.exe < foo.txt的要饋送的參數的UNIX本地可執行。

foo.txt的有兩條線: 酒吧 巴茲

我使用java.lang.ProcessBuilder中執行此命令。不幸的是,prog.exe只能使用來自文件的重定向。有什麼方法可以模仿Java中的這種行爲嗎?

當然,

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

不起作用。

謝謝!

回答

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(); 

未經測試,但類似這樣的應該工作。

+0

在我的情況(JDK 6)中,我必須使用帶有File的InputStream構造函數。帶路徑的字符串沒有爲我工作。謝謝馬克。例如:InputStream fis = new FileInputStream(new File(「/ Path/to/file.txt」)); – tremendows 2013-04-08 07:55:18

0

您是否嘗試將prog.exe包裝爲接受參數並處理prog.exe的腳本? 我假設你使用的是shell,所以設置bash腳本非常簡單。

如果我理解你的問題,腳本會是什麼樣子:

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

這將是罰款,但這樣做的關鍵是從端口UNIX到Windows。所以我不會在新平臺上有一個shell。 – initialZero 2010-06-03 21:34:26

1

重定向是建立你所需要手動待辦事項這個殼,這樣的事情:

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

使用ProcessBuilder構建過程,然後使用process.getOutputStream()獲取將流水到流程的標準輸入的OutputStream。

打開使用普通的Java技術文件,讀取文件的內容,並將其寫入OutputStream要你與ProcessBuilder製造的過程。

你現在的問題是,我們在調用ProcessBuilder推出

$ prog.exe foo bar 

這可能是沒有接近你想要達到的目標。

2

我最終做了這樣的事情,它的工作原理。感謝所有的幫助!

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