ネッティー学習は - はじめに

JavaのNiOをByteBufたByteBufferネッティー同様のクラス、バッファパイプへの書き込み/読み出しデータの保存、データは、コンテナと呼ばれることがあります。

public abstract class ByteBuf implements ReferenceCounted, Comparable<ByteBuf> 
复制代码
最初ByteBufは、ユーザーが自分のニーズに応じて自動的に拡張を拡張するために使用することができ、継承することができる抽象クラスであり、固定のByteBufferの容量は、初期化が上記のコードから変更することはできません後とReferenceCountを実装しますそれは参照カウントと比較操作はプーリング支援をサポートするサポートすること匹敵するインターフェースは2つの添え字はreaderIndexとwriterIndex(図1)は、操作が容易ではなく、インデックスのByteBuffer一方のみ位置されている、読み出し/書き込み動作は、間の遷移を必要とします透明複合ゼロコピーのサポートを実現することができ、内部バッファは呼び出しをチェーン
図1

3つのモードで使用することByteBuf:

  • スタックバッファこのバッファ・モード・データ(ByteBufのデータ)がJavaヒープに格納され、支持アレイと、データはバッファ配列を取得することによって取得してもよいができるUnpooled.buffer()、またはUnpooled.copiedBuffer()メソッドは、データにアクセスするときに、ヒープ・バッファ・アレイをサポートするかどうかを決定するために、第1 hasArray()と、作成し、データ・バッファがバイト配列を取得するために、アレイ()メソッドを使用します
  • ダイレクトバッファー:データはJavaヒープ外メモリ領域に格納され、この領域は、直接バッファJVMによって管理することができ、全く支持アレイはUnpooled.directBuffer(によって作成することができない)、このバッファの内容をする必要があります割当データは、JVMの外部に格納されているため、全てのGetBytesメソッドを使用する必要があり、得ることができるようにする(readerIndex()、バイト[ ]) バッファのバイト配列に直接データをコピーする方法。しかし、このバッファの利点は、あなたが直接することができ、あなたが最初に直接、ネットワーク送信バッファに直接JVM内のバッファのデータを送信データを割り当てる必要があるときに、ヒープバッファに我々のデータならば送信することができることです送信されました。このバッファは、JVMのため、そのリリースと配布高価なので、もはやありません。
  • 合成バッファ:使用CompositeByteBufクラス実装は、ByteBuf CompositeByteBufインスタンスを複数に格納することができるビューByteBuf複数に集約することができ、不要なコピーを避け、良好なバッファの再利用です。あなたは()Unpooled.compositeBufferによって作成することができます。

追加:他の包装用緩衝液で並んでいない緩衝液のみでなく、そのデータを格納します。

基本的な使い方ByteBuf

最も基本的な方法のいくつかについて話をするここではスペースの都合上、他の用途を学ぶためにAPIを参照してください。第一は、添字1は上面図であるターゲットを移動させることなくある、/バッファストアの基本的な動作であるデータを、一つは移動の対象となる/ストア二種類ByteBufメインデータを読み取るを読み出しreadIndexとwriteIndex 2つの添字。読み取りと書き込みの標準の先頭に移動すると、インデックスの先頭の方法を取得および設定するための一般的な方法は、移動しません。
ByteBuf.readBytes(バイト[] BTS) バッファアレイBTSに現在のデータをコピーします。 現在のバッファを増やすreadIndex
ByteBuf.readBytes(BTF ByteBuf) データバッファは現在のバッファに書き込まれるBTF 現在のバッファreadIndex増加、writeIndexのBTF
ByteBuf.writeBytes(バイト[] BTS) カレントバッファにBTSアレイライトデータ 現在のバッファを増やすwriteIndex
ByteBuf.writeBuf(BTF ByteBuf) 現在のバッファにBTFライトデータバッファ 現在のバッファwriteIndex増加、readIndexのBTF
ByteBuf.getBytes(int型のインデックス、バイト[] BTS) 現在のカーソル位置のインデックスバッファから始まる、BTSの現在のデータバッファをコピーします ラベルは移動しません。
ByteBuf.getBytes(int型のインデックス、ByteBufのBTF) コピーバッファの現在の内容は、現在のカーソル位置のインデックスバッファから始まる、BTFします
ByteBuf.setBytes(int型のインデックス、バイト[] BTS) インデックスマークバッファの現在位置から開始し、現在のバッファにデータを格納するBTS
ByteBuf.setBytes(int型のインデックス、BytsBufのBTF) インデックスマークバッファの現在位置から開始し、現在のバッファにデータを格納するBTF

IndexOutOfBoundsExceptionがスローされます上記の方法は、クロスボーダーの操作に注意を払う必要があります。

注:ByteBuf.readBytes(BTF ByteBuf)の方法では、BTFを充填必要、またはバッファの現在の内容は、単に、すべての完成BTF充填し、いずれかの現在のバッファの内容は、すべて書かBTFはないが、それは完全BTFであります、またはそうでなければ例外がスローされます。

そしてまたmarkWriterIndex()\ markReaderIndexとresetWriterIndex()/ resetReaderIndex()によって達成、/リセット動作マーキングwriteIndex ByteBuf readIndexを提供します。

ByteBuf.clear()は、2つの添え字0をリセットする方法が、バッファの元の内容をクリアしません。

読取データのByteBuf.discardReadBytes()メソッドはreaderIndexそう= 0、クリアされ、そしてwriterIndexはclear()メソッドと比較して、前方に移動し、この方法は、データの複製を生成し、遅く、メモリ不足の状況を押圧推奨しました使用しています。

ます。https://juejin.im/post/5cfe0e1551882506cf358171で再現

おすすめ

転載: blog.csdn.net/weixin_33794672/article/details/93178462