处理流中不同大小的字节数组



我有一个方法"A",它在每次调用时返回一个固定大小(例如64字节)的byte[outputSize]。我还有一个方法"B",需要提供一个可变大小的字节[inputSize](例如,它可以小于或大于64个字节)。我想使用流来馈送从"a"到"B"的64字节块的序列,而不丢失任何单个字节。

我尝试将这些64位块馈送到ByteArrayOutputStream"out",直到到达out.size > inputSize。然后从"out"的副本创建一个ByteArrayInputStream"in",以向方法"B"提供从"in"读取的byte[inputSize]

然后重置"out",并将未读取的字节复制到"out"。这是实现这一目标的正确方法吗?还是有更简单/更快/更好的方法?下面是一个伪代码示例:

ByteArrayOutputStream out = new ByteArrayOutputStream();
public byte[] A() {
    return next64bytes;
}
public void B(byte[] bytes) throws IOException {
    while (out.size() < bytes.length) {
        out.write(A()); // feeding "out" with 64 bytes
    }
    ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
    in.read(bytes); // feeding "bytes" with bytes.length bytes
    byte unread[];
    in.read(unread = new byte[in.available()]);
    out.reset();
    out.write(unread); // basically writing unread bytes of "in" in an empty "out"
}

使用ByteArrayOutputStream作为缓冲区并不是非常高效,但它确实可以生成更干净的代码,这通常更重要。以下是你可以做得更好的方法:

public void B(byte[] bytes) {
    while (out.size() < bytes.length) {
        byte[] chunk = A();
        out.write(chunk, 0, chunk.length);
    }
    byte[] buffered = out.toByteArray();
    out.reset();
    System.arraycopy(buffered, 0, bytes, 0, bytes.length);
    out.write(buffered, bytes.length, buffered.length - bytes.length);
}

为什么不简单地使用ByteArrayOutputStream.writeTo(B)?

编辑:所以在拖动出你真正想做的事情之后;为此忘记溪流。的问题可以用流来解决,但它并不比复制字节更简单。由于流是用于I/O的,因此您最终会得到额外的异常处理,但不会为问题带来额外的值。

使用成员变量来记住以前对B()调用的剩余字节,并使用普通循环填充数组,在剩余字节用完时从a()请求更多数据。

相关内容

  • 没有找到相关文章

最新更新