我有一个输入字节数组,我想将其提供给外部程序的标准输入(Process
)。另外,我想以字节数组的形式收集输出。
最优雅的方法是什么? PipedInputStream
/ PipedOutputStream
? nio.channels.Pipe
?
示例代码将是一个加号,因为我无法真正弄清楚如何以一种好的方式做到这一点......
答案 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)
将PipedInputStream
与PipedOutputStream
和彼得的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();