我有一个方法"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()请求更多数据。