如何使用java.lang.Process类为另一个进程提供输入

时间:2012-04-24 07:33:48

标签: java

假设有一个程序从标准输入中获取输入。

例如:

cin>>id;

我想弄清楚的是如何执行该过程并为其标准输入提供一些输入。获取流程的输出对我来说不是问题。它工作正常。问题是如何使用java.lang.Process类为这些流程提供输入。

如果还有其他第三方库,如Apache公共,请同时提及它们。

提前致谢!

2 个答案:

答案 0 :(得分:3)

使用Process.getOutputStream()write()。由于您将输出流用于输入数据到进程,这有点棘手,但名称反映了返回的界面(从您的应用程序的角度来看,它是输出,因为你写信给它。)

答案 1 :(得分:2)

您需要启动一个单独的线程,该线程从一个进程的输出读取并将其作为输入写入另一个进程。

这样的事情应该做:

class DataForwarder extends Thread {

    OutputStream out;
    InputStream in;

    public DataForwarder(InputStream in, OutputStream out) {
        this.out = out;
        this.in = in;
    }

    @Override
    public void run() {
        byte[] buf = new byte[1024];
        System.out.println("Hej");
        try {
            int n;
            while (-1 != (n = in.read(buf)))
                out.write(buf, 0, n);
            out.close();
        } catch (IOException e) {
            // Handle in some suitable way.
        }
    }
}

prod >> cons用于以下内容:

class Test {
    public static void main(String[] args) throws IOException {

        Process prod = new ProcessBuilder("ls").start();
        Process cons = new ProcessBuilder("cat").start();

        // Start feeding cons with output from prod.
        new DataForwarder(prod.getInputStream(), cons.getOutputStream()).start();
    }
}