Java 进程需要重定向输入

Java 进程需要重定向输入,java,processbuilder,Java,Processbuilder,我有一个UNIX本机可执行文件,需要像这样输入参数 prog.exe文件 echo$2>>文件 prog.exe

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

prog.exe foo.txt有两行: 酒吧 巴兹

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

当然,

ProcessBuilder pb = new ProcessBuilder("prog.exe", "bar", "baz"); 
不起作用


谢谢

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

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

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

重定向由shell设置,您需要手动执行此操作,类似于:

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

未测试,但类似的方法应该可以工作。

使用
ProcessBuilder
构建流程,然后使用获取输出流,该流将通过管道传输到流程的标准输入

使用普通Java技术打开文件,读取文件内容并将其写入
OutputStream
,转到您使用
ProcessBuilder创建的进程

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

$ prog.exe foo bar

这可能与您想要实现的目标相差甚远。

我最终做了类似的事情,效果很好。谢谢你的帮助

    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);
        }
    }
导入java.io.BufferedWriter;
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.io.OutputStreamWriter;
导入java.io.PrintWriter;
导入java.util.LinkedList;
导入java.util.List;
公共类UserInp{
公共静态void main(字符串[]args){
新的UserInp().sample();
}
公开作废样本(){
String命令=“foo.exe”;
List args=new LinkedList();
参数添加(“条”);
参数添加(“baz”);
ProcessBuilder pb=新的ProcessBuilder(命令);
java.lang.Process进程=null;
试一试{
process=pb.start();
}捕获(IOEX异常){
//--
}
OutputStream os=process.getOutputStream();
PrintWriter pw=新的PrintWriter(新的BufferedWriter(新的OutputStreamWriter(os));
最终的InputStream=process.getInputStream();
新线程(newrunnable()){
公开募捐{
试一试{
BufferedReader br=新的BufferedReader(新的InputStreamReader(is));
弦线;
而((line=br.readLine())!=null){
系统输出打印项次(行);
}
}捕获(java.io.ioe异常){
}
}
}).start();
for(字符串arg:args){
pw.println(arg);
}
关闭();
int returnCode=-1;
试一试{
returnCode=process.waitFor();
}捕获(中断异常例外){
//--
}
System.out.println(返回码);
}
}

这很好,但重点是从UNIX到Windows的端口。在我的例子(JDK 6)中,我必须使用接受文件的InputStream构造函数。带路径的字符串对我不起作用。谢谢你,马克。例如:InputStream fis=新文件InputStream(新文件(“/Path/to/File.txt”);您还可以使用pb.redirectInput(文件);
    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);
        }
    }