Java-nio-buffer

提供:Dev Guides
移動先:案内検索

Java NIO-バッファー

Java NIOのバッファは、チャネルへのデータの書き込みまたはチャネルからのデータの読み取りに使用できるデータチャンクの固定サイズのコンテナとして機能する単純なオブジェクトとして扱うことができるため、バッファはチャネルのエンドポイントとして機能します。

チャネルとの間でデータを読み書きするために、メモリブロックの処理をより便利にする一連のメソッドを提供します。

IOデータは、非同期および同時データフローをサポートしないストリームの形式で処理されるため、BuffersはNIOパッケージを従来のIOと比較してより効率的かつ高速にします。また、IOはチャンクまたはバイトグループでのデータ実行を許可しません。 。

Java NIOバッファを定義する主なパラメータは、次のように定義できます-

  • 容量-バッファに保存できるデータ/バイトの最大量。バッファの容量は変更できません。バッファがいっぱいになると、書き込む前にクリアする必要があります。
  • 制限-制限には、バッファのモードごとに意味があります。 バッファ制限の書き込みモードでは、バッファに書き込むことができる最大データを意味する容量に等しくなります。バッファ制限の読み取りモードでは、バッファから読み取ることができるデータ量の制限を意味します。
  • 位置-バッファ内のカーソルの現在の位置を指します。バッファの作成時に最初に0に設定されます。つまり、get()によって自動的に更新される、読み取りまたは書き込みが行われる次の要素のインデックスです。およびput()メソッド。
  • マーク-バッファ内の位置のブックマークをマークします。mark()メソッドが呼び出されると、現在の位置が記録され、reset()が呼び出されると、マークされた位置が復元されます。

バッファタイプ

Java NIOバッファは、バッファが扱うデータ型に基づいて、次のバリアントに分類できます-

  • ByteBuffer
  • MappedByteBuffer
  • CharBuffer
  • DoubleBuffer
  • FloatBuffer
  • IntBuffer
  • LongBuffer
  • ShortBuffer

バッファの重要な方法

既に述べたように、Bufferはメモリオブジェクトとして機能し、メモリブロックの処理をより便利にする一連のメソッドを提供します。以下は、Bufferの重要なメソッドです。

  • * allocate(int capacity)*-このメソッドは、パラメータとして容量を持つ新しいバッファを割り当てるために使用されます。Allocateメソッドは、渡された容量が負の整数である場合にIllegalArgumentExceptionをスローします。
  • * read()およびput()*-チャネルの読み取りメソッドは、チャネルからバッファにデータを書き込むために使用されますが、putは、バッファにデータを書き込むために使用されるバッファのメソッドです。
  • * flip()*-flipメソッドは、Bufferのモードを書き込みモードから読み取りモードに切り替えます。また、位置を0に戻し、書き込み時の位置の制限を設定します。
  • * write()およびget()*-チャネルの書き込みメソッドは、バッファからチャネルにデータを書き込むために使用されますが、getは、バッファからデータを読み取るために使用されるバッファのメソッドです。
  • * rewind()*-位置をゼロに戻し、limitの値を変更しないため、再読み込みが必要な場合にrewindメソッドが使用されます。
  • * clear()およびcompact()-読み取りモードから書き込みモードへのバッファーの作成には、両方のメソッドを使用してclearおよびcompactを使用します。 clear()メソッドは、位置をゼロにし、このメソッドでの容量に等しい制限を行います。バッファーはクリアされず、マーカーのみが再初期化されます。 +一方、 compact()*メソッドは、未読データが残っている場合に使用し、この場合もバッファの書き込みモードを使用します。この場合、compactメソッドはすべての未読データをバッファの先頭にコピーし、最後の未読要素。limitプロパティはまだcapacityに設定されています。
  • * mark()およびreset()*-名前が示すように、markメソッドを使用して、バッファー内の特定の位置をマークし、リセット位置をマークされた位置に戻します。

次の例は、上記で定義されたメソッドの実装を示しています。

import java.nio.ByteBuffer;
import java.nio.CharBuffer;

public class BufferDemo {
   public static void main (String [] args) {
     //allocate a character type buffer.
      CharBuffer buffer = CharBuffer.allocate(10);
      String text = "bufferDemo";
      System.out.println("Input text: " + text);
      for (int i = 0; i < text.length(); i++) {
         char c = text.charAt(i);
        //put character in buffer.
         buffer.put(c);
      }
      int buffPos = buffer.position();
      System.out.println("Position after data is written into buffer: " + buffPos);
      buffer.flip();
      System.out.println("Reading buffer contents:");
      while (buffer.hasRemaining()) {
         System.out.println(buffer.get());
      }
     //set the position of buffer to 5.
      buffer.position(5);
     //sets this buffer's mark at its position
      buffer.mark();
     //try to change the position
      buffer.position(6);
     //calling reset method to restore to the position we marked.
     //reset() raise InvalidMarkException if either the new position is less
     //than the position marked or merk has not been setted.
      buffer.reset();
      System.out.println("Restored buffer position : " + buffer.position());
   }
}

出力

Input text: bufferDemo
Position after data is written into buffer: 10
Reading buffer contents:
b
u
f
f
e
r
D
e
m
o
Restored buffer position : 5