流程需要重定向输入

我有一个UNIX本机可执行文件,需要像这样输入参数

prog.exe <foo.txt。

foo.txt有两行:bar baz

我正在使用java.lang.ProcessBuilder来执行此命令。 不幸的是,prog.exe只能使用文件中的重定向。 有什么方法可以模仿Java中的这种行为吗?

当然,

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

不起作用。

谢谢!

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

未经测试,但这样的事情应该有效。

我最终做了类似这样的事情并且有效。 感谢您的帮助!

  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 args = new LinkedList(); 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); } } 

重定向是由您需要手动设置的shell设置的,类似于:

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

您是否尝试将prog.exe包装到接受参数并处理prog.exe的脚本中? 我假设您正在使用shell,因此设置bash脚本非常简单。

如果我理解你的问题,脚本将如下所示:

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

使用ProcessBuilder构建流程,然后使用process.getOutputStream()获取将传递到流程标准输入的OutputStream。

使用常规Java技术打开文件,读取文件的内容并将其写入OutputStream转到使用ProcessBuilder的Process。

您现在遇到的问题是您正在调用ProcessBuilder来启动

 $ prog.exe foo bar 

这可能与您想要达到的目标无关。