我有一种方法" 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"
}
答案 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);
}