【问题标题】:Byte arrays as standard input / output for external program.字节数组作为外部程序的标准输入/输出。
【发布时间】:2011-07-30 09:17:16
【问题描述】:

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

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

示例代码将是一个加分项,因为我真的不知道如何以一种好的方式做到这一点...

【问题讨论】:

    标签: java process stream bytearray nio


    【解决方案1】:

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

    【讨论】:

    • 对,这实际上是我在管道无法工作时所做的...但是由于该进程与“主线程”并行运行,我认为我可以得到管道以任何方式工作。这不可能吗? (有相当多的样板可以“手动”循环并将数据从流程输入流传输到 ByteArrayOutputStream。)
    • @aioobe 没有。 Pipe 的 reader 需要与 Pipe 的 writer 处于不同的线程中。否则使用 Pipes 完全没有意义。
    【解决方案2】:

    PipedInputStreamPipedOutputStream 和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();
    

    【讨论】:

    • PipedInput/OutputStream 是在线程之间使用的。如果你不在线程之间使用它们,你会遇到死锁。
    • @EJP 正如我在上面写的:“可选地将引用移交给另一个进程,即 Java 线程”。 “可选”是不走运的。我应该指出,你应该在另一个线程中使用它。感谢您的澄清!
    【解决方案3】:

    复制数据的 OutputStream 怎么样。您可以将任意数量的 OutputStreams 包括 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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多