NIOソケットプログラミングガイドと研究では、バッファノート

バッファBuffer概要

NIOバッファ内の基本データ型の値を格納するための容器であり、それは双方向データを格納し整理する規則配列と類似しています。

バッファ内NIOアート、あり、4箇所のコア技術があります。

  • 容量(キャパシティ)
  • リミット(上限)
  • 位置(ポジション)
  • マーク(マーク)

4点値技術との大小関係:

0 <=マーク<=位置<=リミット<=容量

バッファ容量素子の数を表し、バッファ容量が負であることはできない。含まれており、容量を変更することはできません。

バッファ限界指数(インデックス)に読み書きされるべきではない最初の要素を表す。バッファ制限(リミット)が容量制限を超える負としないことはできない。新たな位置は、その後、限界値よりも大きい場合位置は、新しい制限に設定されている。マークが定義され、新しい制限値より大きく、マークが破棄された場合。

バッファ位置インデックスに読み書きされる「次の」要素(インデックス)を表し、バッファの位置(場所)は負にすることはできません、及び位置は、その限界を超えることはできません。マークが定義されている場合と、新しいより大きい位置は、マークを捨てます。

方法

  • INT位置():このバッファの位置を返します。
  • バッファの位置(INT newPosition):このバッファの新しい位置を設定します。
  • 「現在の位置」と上限との間の要素の数を返す:()残存するint型。
  • バッファのマーク():.フラグを設定このバッファ位置のフラグバッファインデックス、reset()メソッドを呼び出すとき、バッファインデックス位置特定のためにリセットされるのです。
  • ブールIsReadOnlyのは():このバッファが読み取り専用であるバッファ知らせます。
  • ブールisDirect()現在:これは、バッファがダイレクトバッファであるか否かを判断します。
  • 最終のバッファクリア():初期状態に還元バッファ位置は、バッファ内の「本当にはっきりしない」データ「デフォルトとして全て」、0を含むように設定する能力に限界を設定し、フラグを破棄、すなわちれます。しかし、データは忘却の状態にあります。
  • 最終のバッファフリップ():フラグが定義されている場合、現在の位置に最初の制限を反転このバッファは、その後、位置タグが破棄され、0に設定されます。
  • 最終的なブールhasArray()は:これは、バッファがアクセス元の配列を有しているか否かが判定されます。
  • 最終的なブールhasRemaining():現在の位置と制限との間のすべての要素かどうかを決定します。
  • 最終バッファー巻き戻し():このバッファを巻き戻し、及び位置は人気の説明の0破棄フラグ.rewin()メソッドに設定されているが、「フラグクリア、位置の値が変更を制限する、正規化された位置0であった。」:巻き戻し()メソッド効果は、典型的には、再読み出しデータバッファを用いています。
  • 最終INT arrayOffset():すなわち、サブクラスは、この値を処理しないことがあり、配列の最初の要素のオフセットバッファを達成するために、このバッファの底部を返し、この値は文書の「オプション」とラベル付けされています。

比較リワインド()、クリア()、フリップ()メソッド

  • 巻き戻し():バッファは、「再読み込み」のデータが準備含まれている、それは制限が位置が0に設定され、変更されないままになります。
  • クリア():新しいチャネルバッファの系列を読み取るされていることを確認または操作の準備ができて相対PUT(値)、すなわち、それは容量の大きさを制限するために設定され、位置が0に設定されています。
  • フリップ():新しいチャネルバッファの系列が書き込まれ作る又は相対的に(値)を取得動作可能な状態、すなわち、現在の位置にそれを制限し、位置は0に設定されています。

これらの3つの方法が焦点を当てて上にあります:

  1. 巻き戻し():「再」、再読み取り、再書き込みでの焦点は使用することができます。
  2. クリア():に焦点を当て、「すべてのものは状態もしたいと思います」。
  3. 反転():ストリングを傍受焦点を当てています。

ByteBuffer

バッファのByteBufferクラスは、バッファ内のデータバイトにアクセスすることができますクラスのサブクラスですが、それはまた、比較的一般的で重要なクラスのバッファです。

直接バッファ

  1. 非ダイレクトバッファ

    ByteBufferにアクセスしてディスクにデータを一時的にJVMをバッファするのに必要な中間データに格納されている頻出データ操作が発生がある場合、各時間は、動作データを一時的にその後のByteBufferに、中間バッファJVMに格納されていますそうする処理は、大きく非ダイレクトバッファがデータ処理をホールドソフトウェアの低い動作効率をもたらす、メモリ共有を改善する、データ・スループットのソフトウェアを減らすことになります。

  2. 直接バッファ

    JVMは、すなわち、バッファネイティブI / O操作で直接実行しようと、カーネル空間上で直接動作効率を向上させるために、アクセス。各原則の運転効率がオペレーティングシステムの前に呼ばれている改善のI / O操作の日以降、JVMは、このように保存し、中間バッファにバッファの内容をコピーし回避しようと、あるいは中間バッファから内容をコピーしますステップ。

    ファクトリメソッドallocateDirect()時間コスト配分と間接バッファよりもバッファに返されるために必要なメモリの解放。バッファデータを直接操作するJVMスタックではないが、カーネル空間で、この構造は良いダイレクトバッファは、それらの保存、分析することができ受けやすいネイティブオペレーティングシステム操作はI O /ロット、長期保存に影響するデータのを。

    直接データ交換を使用して、バッファは、従って、さらに中間バッファJVMを作成するステップを縮小処理効率を高め、直接新しいバッファのJVMを作成せずに処理を進め、カーネル空間で、両端で達成されます。

方法

  • allocateDirect(int型の容量):新しいダイレクトbyteバッファを割り当てることが遅いです。新しいバッファは、その制限がその容量になり、そのマークが不確実である、ゼロになります。かどうかは、それは補助配列を持っており、そのマークは不明です。バッファタイプから作成DirectByteBuffer使用allocateDirect()のByteBufferバッファ方式を作成する際に、容量が参照バイト IntBufferバッファを作成しながら、数、容量が指すint型のバイトを変換する場合は、値の数は、容量値が4で乗算され、計算占めるバイト数の合計。

  • (INT容量)を割り当てる:非直接バイトのバッファを割り当てます。新しいバッファは、その制限がその容量になり、そのマークが不確実である、ゼロになります。それは持っているだろう補助配列を、オフセットデータはゼロになります。バッファタイプから作成HeapByteBuffer

  • バッファにバイト配列:(バイト[]配列)を包みます。新しいバッファはそれが、言う修飾するバッファアレイ、およびその逆に変更をもたらすことで、バイト配列のサポートを説明します。

  • ラップ(バイト[]配列を、int型 、int型の長さをオフセット): バッファにバイト配列。新しいバッファは、つまり、バイト配列のサポートを説明するバッファへの変更は、配列が変更されます、そして逆もまた同様です。新しいバッファの容量はarray.length、位置はオフセットされ、その限界は+長オフセットされ、そのマークは未定義になります。

  • プット(バイト[] SRC、オフセットINT、INTの長さ):現在のアレイ位置からこのバッファにバイトに所定のソースを輸送する相対一括putメソッド。

    • SRC:現在のデータ配列srcの位置をバッファ。
    • オフセット:「アレイのオフセット」で読み取られる最初のバイトを、そして「バッファオフセットない」、非負とsrc.length超えないでなければなりません。
    • 長さ: - オフセット指定された配列から読み取られたバイトの数は、非負とsrc.length超えないでなければなりません。
  • (バイト[] DST、int型の長さをオフセットINT)取得:相対一括getメソッドを、指定された配列にどのバッファバイト転送、この現在位置。

  • (int型のインデックス、バイトb)に置く : 指定されたインデックスで、このバッファに絶対プット方法、指定されたバイトを。位置変わらず

  • (int型のインデックス)を取得:絶対getメソッドを、指定した位置のインデックスでバイトを読み取ります。位置変わらず

  • (SRCのByteBuffer)入れ:相対一括PUTメソッド、この方法は、バッファ内のバッファ位置に残りのソース電流バイトが与えられます。

  • スライスは、():その内容は、このバッファの内容で新しいバイトのバッファを作成し共有のサブシーケンスを新しいバッファの内容は、このバッファの現在位置から開始します。二つのバッファ、および制限フラグ独立;このバッファの内容への変更は新しいバッファ、およびその逆に表示されています。

  • asCharBuffer():文字バッファーとしてこのbyteバッファーのビューを作成します。新しいバッファの内容は、このバッファの現在位置から開始します。このバッファの内容への変更は、新しいバッファに表示され、及びその逆;二つのバッファ、マーカーおよび限界値は、互いに独立しています。新しいバッファはゼロであり、マーカーは不確実であるバッファ内の残りのバイト数のこの半分の能力を制限するであろう。

  • asReadOnlyBuffer()現在:この新しい読み取り専用バイトのバッファの共有バッファの内容を作成します。この目的のために、バッファの新しいバッファの内容のコンテンツを終了します。

  • このバイト圧縮バッファ(オプション)、バッファの先頭に現在位置と制限バッファー(もしあれば)との間のバイト、すなわちインデックスp =位置():コンパクト() 1インデックスにコピーされたバイトN =上限( - ) - 1-Pで()のインデックス限界までように、インデックス0、インデックス1のバイトコピーP + 1のインデックスと、にコピー。次いで、バッファ位置は、n + 1に設定され、その容量の限界に設定されています。フラグが定義されている場合、それは破棄されます。

  • ()に等しい:比較は制限する位置コンテンツを完全に異なっています。

  • compareTo(ByteBufferのこと)は、このバッファが別のバッファと比較されます。2つのバイトのバッファの比較は、それらの辞書と比較することである残りの要素の配列にかかわらず、対応するバッファ内の各シーケンスの開始位置の、。

  • ByteBuffer)が(複製:この新しいバイトのバッファの共有バッファの内容を作成します。この目的のために、バッファの新しいバッファの内容のコンテンツを終了します。このバッファの内容への変更は、新しいバッファ、およびその逆に表示されます。

    重複()メソッドとスライス()メソッドは、新しいバッファ・オブジェクトを作成し、まだバッファ使用バイトの元のバッファ・バイト[]配列

ビューバッファ

  • asCharBuffer()
  • asDoubleBuffer()
  • asFloatBuffer()
  • asIntBuffer()
  • asLongBuffer()
  • asShortBuffer()

表示バッファとはByteBuferに比べ、以下の3つの利点を有します。

  1. ビュー・インデックス・バイトのバッファがありますが、型固有の価値は、その大きさに応じてインデックス化。
  2. 表示バッファは、相対バルク取得および方法を入れて提供する、これらの方法は、バッファとバッファ配列、または同じの他のタイプの間で伝送値の連続した配列であり得ます。
  3. バッファがダイレクトであるとき、それはバイトのバッファをサポートしている場合にだけ、それが直接のバッファであるため、ビューバッファは、より効率的かもしれません。

バイト順序を設定しますが得られます

バイト読み出しは異なる順序でCPUが同じではない2つのCPUのデータ転送はバイトの順に配置されなければならない場合、CPUは、いくつかのハイから読み出しを開始し、CPUおよびいくつかの低から読み出しを開始します団結、そしてorder(ByteOrder bo)方法が場に出たとき、その役割はバイトの順序を設定することです。

そのハイとローは何ですか?

例えばFF1Aとして16ビット(2バイト)のデータは、FFはロー1A、高い場合。32ビットのデータ、例えば3F68415B場合、上位ワードは3F68であり、415Bは、右側の低い、左が高い、低い単語です。

このバッファ獲得バイト順序:順序()メソッドBYTEORDER効果。上位バイトバッファは常に新しい創造ですBIG_ENDIAN

  1. public static final BYTEORDER BIG_ENDIAN:表しBIG_ENDIAN一定のバイト順序を。このためには、最下位ビットへのマルチバイトの最上位ビットからバイト順。

  2. pulicのstatic final BYTEORDER LITTLE_ENDIAN:示しLITTLE_ENDIANバイトオーダー定数を。このために、バイト順は最上位ビットと最下位ビットからマルチバイト値です。

    オーダー(BYTEORDERのBO):デフォルトでは、このバッファを変更するには、バイト順序は、最初のオーダーバイトバッファは常にありますBIG_ENDIAN

CharBufferの

方法

  • 公共CharBufferのは、(文字C)を追加します。このバッファー(オプション)指定された文字を追加します。それはと同等です。dst.put(c)
  • 公共CharBufferのはappend(CharSequence引数のCSQ):このバッファ(任意のオペレーション)に指定された文字列。それはと同等です。dst.put(csq.toString())
  • 公共CharBufferのは(たCharSequenceのCSQ、int型の追加開始、int型エンド): サブ指定された文字シーケンスのこのバッファー(任意のオペレーション)に添加します。CSQがnullでない場合、呼び出されたメソッドの形式であるdst.append(csq, start, end)と同等:dst.put(csq.subSequence(start, end).toString())
  • 公共最終チャーのcharAt(int index)指定さ:現在の位置に対して指定されたインデックスの文字を読み取ります。
  • 相対一括putメソッド(オプション):(列src)を置きます。等価dst.put(s, 0, s.length()):へ
  • 読んでint型(CharBufferの目標):バッファ文字で現在の文字は、指定された文字バッファへの書き込みをしようとします。
  • さらに、subSequence(int型開始、int型エンド):作成は、新しい文字バッファーの現在位置からの相対位置、このバッファの指定されたサブシーケンスを表します。新しいバッファは、このバッファを共有し、このバッファの内容が可変である場合、すなわち、変更が別のバッファにバッファをもたらすであろうが修正されます。
  • パブリック静的CharBufferのラップ(CharSequence引数のCSQ、 int型開始、int型エンド): バッファに文字の列。新しい読み取り専用バッファは、指定された文字列の内容になります。バッファ容量)(csq.lengthれ、その位置は不定とマークされ、制限が終了するれ、開始されます。
    • CSQ:新しい文字バッファーを作成し、そこから文字の配列の代表。
    • スター:)非負と(csq.lengthよりない値でなければならないあなたは、インデックスを使用する最初の文字を表します。新しいバッファの位置は、この値に設定されます。
    • 終了:使用する最後の文字の後の文字のインデックスは、それは)(csq.lengthより開始より小さくなくてはなりません。新しいバッファは、この限界値に設定されています。戻り値は新しい文字バッファーです。
  • 公共の最終int型の長さ():この文字バッファの長さを返します。文字列として文字バッファが、(を含む)と、(含まれていない)制限文字数の位置との間の長さと、その残り()の長さに相当します。

参考:高Hongyan「NIOソケット付きプログラミングガイド」

おすすめ

転載: juejin.im/post/5d1c37146fb9a07ea6488ec4