Java ByteBuffer能否实现数据输出/数据输入?

Java ByteBuffer能否实现数据输出/数据输入?,java,serialization,nio,bytebuffer,Java,Serialization,Nio,Bytebuffer,是否有一些微妙的原因,为什么没有实现或,或者作者只是没有选择这样做?映射调用似乎很简单(例如putInt()->writeInt()) 我(显然还有一些)的基本问题是较旧的类,它们知道如何使用通用接口(DataInput/DataOutput)来序列化/序列化它们自己。我想重用我的自定义序列化,而无需为ByteBuffer编写自定义代理。只需将缓冲区包装在或使用put()或wrap()方法即可。让ByteBuffer直接模拟数据输入/输出流的问题与事先不知道大小有关。如果超支了怎么办 需要的是一

是否有一些微妙的原因,为什么没有实现或,或者作者只是没有选择这样做?映射调用似乎很简单(例如putInt()->writeInt())

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

只需将缓冲区包装在或使用
put()
wrap()
方法即可。让
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...

使用直接缓冲区的更好方法也是:

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

+提到Avero,它看起来很有趣。读取时溢出应该抛出EOFEException;写入溢出将被视为写入完整卷(或者抛出EOF)@Justin:看看
DataOutput
api,是的,这可能很好。也许值得一试,以确保您可以将
DataOutput
代理到
ByteBuffer
上,并在oracle站点上发布一个bug或联系nio专家组。这两个API可能旨在针对不同的抽象级别;我不确定。@Justin:这对你来说可能也很有趣。有关
InputStream
案例,请参阅此相关问题: