【问题标题】:Process requires redirected input进程需要重定向输入
【发布时间】:2010-06-03 21:02:52
【问题描述】:

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

prog.exe

foo.txt 有两行: 酒吧 呵呵

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

当然,

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

不工作。

谢谢!

【问题讨论】:

    标签: java processbuilder


    【解决方案1】:
    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();
    

    未经测试,但这样的东西应该可以工作。

    【讨论】:

    • 在我的例子中(JDK 6),我不得不使用 InputStream 构造函数,它接受一个文件。带有路径的字符串对我不起作用。谢谢马克。例如:InputStream fis = new FileInputStream(new File("/Path/to/file.txt"));
    • 也可以使用pb.redirectInput(file);
    【解决方案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);
            }
        }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 这很好,但重点是从 UNIX 移植到 Windows。所以我不会在新平台上有一个shell。
        【解决方案5】:

        使用ProcessBuilder 构建进程,然后使用process.getOutputStream() 获取将通过管道传输到进程的标准输入的OutputStream。

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

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

        $ prog.exe foo bar
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-06
          • 2022-01-14
          • 2013-10-08
          • 2013-09-06
          • 1970-01-01
          • 1970-01-01
          • 2016-10-12
          • 2011-04-12
          相关资源
          最近更新 更多