可能ByteBuffer实现DataOutput/DataInput?

可能ByteBuffer实现DataOutput/DataInput?

问题描述:

java.nio.ByteBuffer为何不执行java.io.DataOutputjava.io.DataInput,还是作者没有选择这样做?映射调用看起来很简单(例如,putInt() - > writeInt())。可能ByteBuffer实现DataOutput/DataInput?

我的基本问题(和一些others,显然)是老类,它们知道如何使用通用接口来序列化/序列化自己:DataInput/DataOutput。我想重复使用我的自定义序列化,而无需为ByteBuffer编写自定义代理。

只需使用put()wrap()方法将缓冲区包装在ByteArrayInputStreamByteArrayOutputStream中。使用ByteBuffer直接模拟数据输入/输出流的问题与事先不知道大小有关。如果发生超限,该怎么办?

需要的是一个ByteBufferOutputStream您可以在其中包装/暴露所需的行为。这样的例子存在;序列化方案有这样的事情。推出自己的产品并不难。为什么默认情况下没有?那么,它不是一个完美的世界......

ByteArrayOutputStream backing = new ByteArrayOutputStream(); 
DataOutput foo = new DataOutputStream(backing); 
// do your serialization out to foo 

foo.close(); 
ByteBuffer buffer = ByteBuffer.wrap(backing.toByteArray()); 
// now you've got a bytebuffer... 
+0

+提到Avero,它看起来很有趣。 – Justin 2010-11-01 19:33:00

+0

读取的溢出应抛出EOFException;写入溢出将被视为写入一个完整的卷(或只是抛出EOF) – Justin 2010-11-01 19:36:08

+0

@Justin:看看'DataOutput' API,是的,这可能会正常工作。也许值得进行一些小实验,以确保您可以清洁地将'DataOutput'代理下载到'ByteBuffer'上,并在oracle站点上发布错误或联系nio专家组。这可能是这两个API旨在针对不同的抽象层次;我不确定。 – andersoj 2010-11-01 19:40:36

与直接缓冲区过工作的更好的方式:

class ByteBufferOutputStream extends OutputStream 
{ 
    private final ByteBuffer buffer; 

    public ByteBufferOutputStream(ByteBuffer buffer) 
    { 
     this.buffer = buffer; 
    } 

    public void write(int b) throws IOException 
    { 
     buffer.put((byte) b); 
    } 
} 

注意,这需要调用buffer.flip()你写完后它,然后才能读取它。