10

java.nio.ByteBuffer没有实现java.io.DataOutputjava.io.DataInput是否有一些微妙的原因,或者作者只是没有选择这样做?映射调用似乎很简单(例如 putInt() -> writeInt())。

我(和其他一些人,显然)遇到的基本问题是知道如何使用通用接口对自己进行序列化/序列化的旧类:DataInput/DataOutput。我想重用我的自定义序列化而不为 ByteBuffer 编写自定义代理。

4

2 回答 2

4

只需将缓冲区包装在ByteArrayInputStreamByteArrayOutputStream使用put()orwrap()方法即可。直接模拟数据输入/输出流的问题与ByteBuffer事先不知道大小有关。万一超车怎么办?

需要的是一个ByteBufferOutputStream你可以包装/公开所需行为的地方。存在这样的例子;Apache avro序列化方案有这样的东西。自己动手并不难。为什么默认没有一个?好吧,这不是一个完美的世界……

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...
于 2010-11-01T19:23:08.790 回答
4

也可以与直接缓冲区一起使用的更好方法:

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() ,然后才能从中读取。

于 2011-01-29T21:07:54.517 回答