NIO学習ノート——Bufferの作成とコピー

5759 ワード

Bufferの作成


新しいバッファは、割り当てまたはパッケージ操作によって作成されます.割当て操作は、バッファ・オブジェクトを作成し、容量サイズのデータ要素を格納するためのプライベート・スペースを割り当てます.パッケージング操作は、データ要素を格納するためにバッファオブジェクトを作成しますが、スペースを割り当てません.指定した配列をストレージスペースとして使用して、バッファ内のデータ要素を格納します.たとえば、
CharBuffer charBuffer = CharBuffer.allocate (100);

このコードは、100個のchar変数を格納するためにバックアップメモリとしてchar型配列をスタック空間から暗黙的に割り当てた.バッファとして独自の配列のバックアップメモリを提供する場合は、wrap()関数を呼び出します.
char [] myArray = new char [100];
CharBuffer charbuffer = CharBuffer.wrap (myArray);

このコードは新しいバッファオブジェクトを構築しますが、データ要素は配列に存在します.これは、put()関数を呼び出すことによるバッファへの変更がこの配列に直接影響し、この配列への変更がこのバッファオブジェクトにも表示されることを意味します.パラメータとしてoffsetとlengthを持つwrap()関数バージョンでは、指定したoffsetとlengthパラメータ値に従って位置と上界を初期化するバッファが構築されます.次のようにします.
CharBuffer charbuffer = CharBuffer.wrap (myArray, 12, 42);

12のposition値、54のlimit値、myArrayの容量を作成しました.lengthのバッファ.例として用いたCharBufferは他のバッファクラスにはない便利な関数を提供した.
public abstract class CharBuffer
extends Buffer implements CharSequence, Comparable
{
// This is a partial API listing38
public static CharBuffer wrap (CharSequence csq)
public static CharBuffer wrap (CharSequence csq, int start,
int end)
}

Wrap()関数は、読み取り専用のバックアップストレージ領域を作成するCharSequenceインタフェースまたはその実装バッファオブジェクトcharsequenceは、読み取り可能な文字ストリームを記述する
CharBuffer charBuffer = CharBuffer.wrap ("Hello World");

3つのパラメータのwrap()関数バージョンはstartとendの下付きパラメータを使用して、受信したCharSequenceオブジェクトのサブシーケンスを記述します.これはCharSequenceを呼び出すのと同じように便利です.subsequence()関数の変換.Startパラメータはシーケンスで使用される最初の文字で、endは最後の文字の下付き値に1を加算します.

Bufferのレプリケーション


他のバッファに含まれるデータ要素を管理するバッファが作成されると、このバッファはビューバッファと呼ばれる.ビューメモリは、常に既存のメモリインスタンスの関数を呼び出すことによって作成されます.既存のメモリインスタンスのファクトリメソッドを使用すると、ビューオブジェクトが元のメモリの内部実装の詳細がプライベートであることを意味します.データ要素は、元のバッファオブジェクトのget()/put()APIを通過することなく、配列に格納されているか、またはいくつかの他の方法で保存されているかにかかわらず、直接アクセスできます.CharBufferを例にとると,同様の動作を任意の基本的なバッファタイプに用いることができる.
public abstract class CharBuffer
extends Buffer implements CharSequence, Comparable
{
// This is a partial API listing
public abstract CharBuffer duplicate( );
public abstract CharBuffer asReadOnlyBuffer( );
public abstract CharBuffer slice( );
}

Duplicate()関数は、元のバッファに似た新しいバッファを作成します.2つのバッファはデータ要素39素を共有し、同じ容量を有するが、各バッファはそれぞれの位置、上界、タグ属性を有する.1つのバッファ内のデータ要素の変更は、別のバッファに反映されます.このコピー・バッファには、元のバッファと同じデータ・ビューがあります.元のバッファが読み取り専用または直接バッファの場合、新しいバッファはこれらのプロパティを継承します.バッファをコピーすると、新しいBufferオブジェクトが作成されますが、データはコピーされません.元のバッファとコピーは、同じデータ要素を操作します.asReadOnlyBuffer()関数を使用して、読み取り専用のバッファビューを生成できます.これはduplicate()と同様で、この新しいバッファではput()の使用が許可されず、isReadOnly()関数がtrueを返します.この読み取り専用バッファのput()関数を呼び出すと、ReadOnlyBufferException例外が放出されます.読み取り専用バッファが書き込み可能バッファと共有されている場合、またはパッケージされたバックアップ配列がある場合、この書き込み可能バッファまたは直接この配列に対する変更は、読み取り専用バッファ分割バッファを含むすべての関連バッファに反映され、コピーと似ていますが、slice()は元のバッファの現在の位置から始まる新しいバッファを作成します.その容量は、元のバッファの残りの要素数(limit-position)である.この新しいバッファは、元のバッファとデータ要素のサブシーケンスを共有します.分割されたバッファも読み取り専用と直接のプロパティを継承します.
CharBuffer buffer = CharBuffer.allocate (8);
buffer.position(3).limit (5);
CharBuffer sliceBuffer = buffer.slice();

配列位置12~20(9要素)にマッピングされたbufferオブジェクトを作成するには
char [] myBuffer = new char [100];
CharBuffer cb = CharBuffer.wrap(myBuffer);
cb.position(12).limit(21);
CharBuffer sliced = cb.slice();