字节数组作为外部程序的标准输入/输出。

时间:2011-07-30 09:17:16

标签: java process stream bytearray nio

我有一个输入字节数组,我想将其提供给外部程序的标准输入(Process)。另外,我想以字节数组的形式收集输出。

最优雅的方法是什么? PipedInputStream / PipedOutputStreamnio.channels.Pipe

示例代码将是一个加号,因为我无法真正弄清楚如何以一种好的方式做到这一点......

3 个答案:

答案 0 :(得分:1)

管道用于Java中的线程之间。它们不是此解决方案的一部分。要将字节数组写入Process,只需根据需要调用Process.getOutputStream.write(byte [])。要将其读入字节数组,只需调用Process.getInputStream.read(byte [])。如果您不知道将有多少输出,请将其复制到ByteArrayOutputStream中。

答案 1 :(得分:0)

复制数据的OutputStream怎么样?您可以附加任意数量的OutputStream,包括ByteArrayOutputStream。除效率外,不需要第一次写入。

public class MultiOutputStream extends OutputStream {
    private final OutputStream[] outs;

    public MultiOutputStream(OutputStream... outs) {
        this.outs = outs;
    }

    @Override
    public void write(byte[] b, int off, int len) throws IOException {
        for (OutputStream out : outs) 
            out.write(b, off, len);
    }

    @Override
    public void write(int b) throws IOException {
        for (OutputStream out : outs) 
            out.write(b);
    }
}

答案 2 :(得分:0)

PipedInputStreamPipedOutputStream和彼得的MultiOutputStream结合在此处的其他帖子中,您可以获得以下信息:

final int CAPCITY = 4096;
final int PIPE_SIZE = 4096;

PipedOutputStream pout = new PipedOutputStream();
ByteArrayOutputStream bout = new ByteArrayOutputStream(CAPACITY);
MultiOutputStream multiOs= new MultiOutputStream(pout, bout);

PipedInputStream is = new PipedInputStream(pout, PIPE_SIZE);

现在,如果执行:

byte[] bytes = new bytes[1024];
multiOs.write(bytes, 0, 1024);

提供你的PipedInputStream,可选地将引用交给另一个进程,即Java Thread。同时,你写入一个字节数组,可以通过以下方式查询:

bytes[] written = bout.toByteArray();