java.nio.ByteBuffer没有实现java.io.DataOutput或java.io.DataInput是否有一些微妙的原因,或者作者只是没有选择这样做?映射调用似乎很简单(例如 putInt() -> writeInt())。
我(和其他一些人,显然)遇到的基本问题是知道如何使用通用接口对自己进行序列化/序列化的旧类:DataInput/DataOutput。我想重用我的自定义序列化而不为 ByteBuffer 编写自定义代理。
java.nio.ByteBuffer没有实现java.io.DataOutput或java.io.DataInput是否有一些微妙的原因,或者作者只是没有选择这样做?映射调用似乎很简单(例如 putInt() -> writeInt())。
我(和其他一些人,显然)遇到的基本问题是知道如何使用通用接口对自己进行序列化/序列化的旧类:DataInput/DataOutput。我想重用我的自定义序列化而不为 ByteBuffer 编写自定义代理。
只需将缓冲区包装在ByteArrayInputStream
或ByteArrayOutputStream
使用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...
也可以与直接缓冲区一起使用的更好方法:
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() ,然后才能从中读取。