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

Java 字节数组作为外部程序的标准输入/输出。,java,process,stream,bytearray,nio,Java,Process,Stream,Bytearray,Nio,我有一个输入字节数组,我想将其馈送到外部程序的标准输入(进程)。另外,我想收集字节数组中的输出 最优雅的方式是什么管道输出流/管道输出流nio.channels.Pipe 示例代码将是一个加号,因为我真的不知道如何以一种好的方式执行此操作…一个复制数据的OutputStream怎么样。您可以将任意数量的输出流(包括ByteArrayOutputStream)附加到此。除了效率之外,不需要第一次写入 public class MultiOutputStream extends OutputStre

我有一个输入字节数组,我想将其馈送到外部程序的标准输入(
进程
)。另外,我想收集字节数组中的输出

最优雅的方式是什么<代码>管道输出流/
管道输出流
<代码>nio.channels.Pipe


示例代码将是一个加号,因为我真的不知道如何以一种好的方式执行此操作…

一个复制数据的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);
    }
}

复制数据的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);
    }
}

PipedInputStream
PipedOutputStream
和Peter的
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线程。同时,写入字节数组,可通过以下方式查询:

bytes[] written = bout.toByteArray();

PipedInputStream
PipedOutputStream
和Peter的
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线程。同时,写入字节数组,可通过以下方式查询:

bytes[] written = bout.toByteArray();

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

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

PipedInput/OutputStream用于线程之间。如果在线程之间不使用它们,就会出现死锁。@EJP,正如我在上面写的:“可选地将引用移交给另一个进程,即Java线程”。“可选”是不吉利的。我应该指出,你应该在另一个线程中使用它。谢谢澄清!PipedInput/OutputStream用于线程之间。如果在线程之间不使用它们,就会出现死锁。@EJP,正如我在上面写的:“可选地将引用移交给另一个进程,即Java线程”。“可选”是不吉利的。我应该指出,你应该在另一个线程中使用它。谢谢澄清!对,这就是我在管道无法正常工作时所做的。。。但由于这个过程与“主线程”并行运行,我想我可以让管道以任何方式工作。这不可能吗?(有相当多的锅炉板用于“手动”循环,并将数据从流程输入流传输到ByteArrayOutputStream。)@aioobe否。管道的读取器需要与管道的写入器处于不同的线程中。否则使用管道是完全没有意义的。对,这实际上是我在管道无法工作时所做的。。。但由于这个过程与“主线程”并行运行,我想我可以让管道以任何方式工作。这不可能吗?(有相当多的锅炉板用于“手动”循环,并将数据从流程输入流传输到ByteArrayOutputStream。)@aioobe否。管道的读取器需要与管道的写入器处于不同的线程中。否则,使用管道是完全没有意义的。