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

时间:2014-08-29 15:07:49

标签: java stream byte

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

我尝试将这些64位块提供给ByteArrayOutputStream" out"直到达到out.size > inputSize。 然后创建ByteArrayInputStream" in"来自" out"的副本提供方法" B" byte[inputSize]来自" in"。

然后重置" 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"
}

2 个答案:

答案 0 :(得分:0)

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

编辑:所以拖出你真正想做的事情;忘了这个流。问题可以用流解决,但它不仅仅是复制字节。由于流是用于I / O的,因此最终会有额外的异常处理,但没有额外的问题值。

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

答案 1 :(得分:0)

使用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);
}