Байтовые массивы как стандартный ввод / вывод для внешней программы. - PullRequest
2 голосов
/ 30 июля 2011

У меня есть входной байтовый массив, который я хотел бы передать на стандартный ввод внешней программы (Process).Кроме того, я хотел бы собрать выходные данные в байтовом массиве.

Какой самый элегантный способ сделать это?PipedInputStream / PipedOutputStream?nio.channels.Pipe?

Пример кода был бы плюсом, потому что я не могу понять, как это сделать хорошим способом ...

Ответы [ 3 ]

1 голос
/ 01 августа 2011

Трубы предназначены для использования между потоками в Java.Они не являются частью этого решения.Чтобы записать байтовый массив в Process, просто вызовите Process.getOutputStream.write (byte []) так часто, как это необходимо.Чтобы прочитать его в байтовый массив, просто вызовите Process.getInputStream.read (byte []).Если вы не знаете, сколько будет выходных данных, скопируйте его в ByteArrayOutputStream.

0 голосов
/ 30 июля 2011

Комбинируя 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();
0 голосов
/ 30 июля 2011

Как насчет 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);
    }
}
...