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

Java 处理流中不同大小的字节数组,java,stream,byte,Java,Stream,Byte,我有一个方法“a”,它在每次调用时返回一个固定大小的字节[outputSize]。我还有一个方法“B”,需要输入一个大小可变的字节[inputSize](例如,它可以小于或大于64字节)。 我想使用一个流来提供从“a”到“B”的64字节块序列,而不丢失任何单个字节 我试图通过tearrayoutputstream将这些64位数据块送入中“out”,直到到达out.size>inputSize。 然后从“out”的副本创建一个ByteArrayInputStream“in”,为方法“B”提供一个从

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

我试图通过tearrayoutputstream将这些64位数据块送入
中“
out
”,直到到达
out.size>inputSize
。 然后从“
out
”的副本创建一个
ByteArrayInputStream
in
”,为方法“
B
”提供一个从“
in
”读取的
字节[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 out=newbytearrayoutputstream();
公共字节[]A(){
返回NEXT64字节;
}
公共void B(字节[]字节)引发IOException{
while(out.size()
为什么不直接使用ByteArrayOutputStream.writeTo(B)

编辑:所以在拖出你真正想做的事情之后;忘记溪流吧。这个问题可以通过流来解决,但它并不比复制字节简单。因为流是为I/O设计的,所以您最终会得到额外的异常处理,但对于该问题没有额外的值


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

使用
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);
}
public void B(字节[]字节){
while(out.size()
ByteArrayOutputStream将自动增长。。。您不需要手动增长它。您可以更具体一点吗?我应该看哪行代码?[OFF]英文中没有“readed”。读过了@塔马什。我刚刚在我的真实代码中修复了它。B不是OutputStream,你能更明确一点吗?如果我能弄明白你想做什么,我对Java有点迟钝;你的解释在第二句话之后就没有意义了。我只看到您使用非常迂回的方式将数据从一个流写入另一个流。这就是writeTo()可以简化事情的地方。基本上,B是一个随机的64字节数组生成器。方法A将是一个随机的“可变长度”字节数组生成器,它是从B构建的。那么,为什么要使用流呢?为什么不简单地使用System.arraycopy复制字节?为什么没有简单的循环调用A()并将字节[]复制到结果数组?我认为使用流会更简单。-我不能编辑我以前的评论,我的意思是A是一个随机的64字节数组生成器,这个混合代码可以避免丑陋的ByteArrayInputStream解决方案,同时还可以避免一些必要的计算和添加成员变量来记住剩余的字节。如果效率与速度有关,则此处并不重要,因为随机64字节生成器非常慢。