1

ByteBuffer インスタンスの配列をラップして、バイトを新しいバッファにコピーせずに単一のインスタンスのように見せる java.nio.ByteBuffer の実装を知っていますか?

4

2 に答える 2

5

java.nio には実装がありませんが、ほとんどすべてのチャネルが実装GatheringByteChannelScatteringByteChannelており、ByteBuffer の配列を直接読み書きできます。

GatheringByteChannel:

long write(ByteBuffer[] srcs)

指定されたバッファからこのチャネルに一連のバイトを書き込みます。

ScatteringByteChannel:

長いですread(ByteBuffer[] dsts)

このチャネルから指定されたバッファに一連のバイトを読み取ります。

上記のメソッドの部分的なバージョンもあります。上記のリンクを参照してください。

NIO のポイントは、オーバーヘッドをできるだけ低くすることです。この方法では (別のオブジェクトでバッファーをラップするのではなく)、単純な配列よりも多くのオーバーヘッドが発生しません。これとその実装の意図されたユースケースはあなたのものだと思います。

于 2013-03-01T18:24:05.577 に答える
1

標準のJava APIには誰もいません。Grizzly NIO フレームワークには CompositeBuffer がありますが、独自のバッファーをラッパーとして使用します。

import org.glassfish.grizzly.Buffer;
import org.glassfish.grizzly.memory.BuffersBuffer;
import org.glassfish.grizzly.memory.CompositeBuffer;    

....

ByteBuffer byteBuffer = ....;
HeapMemoryManager mm = new HeapMemoryManager();
CompositeBuffer buffer = BuffersBuffer.create();
Buffer b = mm.wrap(byteBuffer);
buffer.append(b);
于 2013-03-01T18:31:16.863 に答える