10

java.nio.ByteBufferがjava.io.DataOutputまたはjava.io.DataInputを実装しない微妙な理由があるのでしょうか、それとも作成者がこれを選択しなかっただけなのでしょうか? 呼び出しをマップするのは簡単に思えます (例: putInt() -> writeInt())。

私 (および明らかにのいくつか) が抱えている基本的な問題は、ジェネリック インターフェイス (DataInput/DataOutput) を使用して自分自身をシリアル化/シリアル化する方法を知っている古いクラスです。ByteBuffer のカスタム プロキシを作成せずに、カスタム シリアル化を再利用したいと考えています。

4

2 に答える 2

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 に答える
4

ByteArrayInputStreamまたはメソッドをByteArrayOutputStream使用してバッファをラップするだけです。データ入力/出力ストリームを直接エミュレートすることの問題は、事前にサイズがわからないことに関係しています。超過した場合はどうなりますか?put()wrap()ByteBuffer

必要なのはByteBufferOutputStream、必要な動作をラップ/公開できる です。この例が存在します。Apache avroシリアライゼーション スキームにはそのような機能があります。自分で巻くのはそれほど難しくありません。デフォルトで1つがないのはなぜですか?まあ、それは完璧な世界ではありません...

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 に答える