流程需要重定向输入

时间:2010-06-03 21:02:53

标签: java processbuilder

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

  

prog.exe< foo.txt的。

foo.txt有两行: 酒吧 巴兹

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

当然,

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

不起作用。

谢谢!

5 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分: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);
        }
    }

答案 2 :(得分:1)

重定向是由您需要手动执行此操作的shell设置的,如下所示:

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

使用普通的Java技术打开文件,读取文件的内容并将其写入OutputStream转到使用ProcessBuilder进行的处理。

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

$ prog.exe foo bar

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

相关问题