ByteBufferの簡単な応用のByteBufferはどのくらい知っていますか?
8831 ワード
まず大牛たちがどう説明しているか見てみましょう.Buffer類はjavaです.Nioの構造基盤.1つのBufferオブジェクトは、メモリ、またはセグメント輸送領域として機能する固定された数のデータのコンテナであり、ここでは、データを格納し、後で取得するために使用することができる.バッファはフルまたはリリースできます.ブール以外の元のデータ型ごとにバッファクラスがあります.すなわち、Bufferのサブクラスには、ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBufferがあります.BooleanBufferの言うことはありません.バッファは、格納された元のデータ型に作用するが、バッファはバイトを処理する傾向がある.非バイトバッファは、バッファがどのように作成されるかによって、バックグラウンドでバイトまたはバイトへの変換を実行できます.技術大牛が説明したのは専門的かもしれないが、私もよく分からない.Bufferはバスのようにデータを一時的に保存し、転送するためのキャリアだと簡潔に理解している.Bufferについての解説ネットにはいろいろありますが、私も巨人の肩に立って小さなまとめをしています.では、まずByteBufferの基本原理を理解してみましょう.文章を参考にすることができます.http://zachary-guo.iteye.com/blog/1457542
◇バッファの4つの属性すべてのバッファには、データ要素に関する情報を提供する4つの属性があります.この4つの属性は簡単ですが、重要です.容量(Capacity):バッファに収容できるデータ要素の最大数に注意してください.この容量は、バッファの作成時に設定され、変更されません.上界(Limit):バッファの最初の読み取りまたは書き込みができない要素.バッファ作成時、limitの値はcapacityの値に等しい.capacity=1024と仮定すると、プログラムにlimit=512が設定されており、Bufferの容量は1024であるが、512以降は読み書きもできないため、Bufferの実際の利用可能なサイズは512であることが理解できる.位置(Position):次に読み書きする要素のインデックス.位置は、対応するget()関数とput()関数によって自動的に更新されます.マーク(Mark):メモの場所です.タグは設定前は未定義(undefined).使用シーンは、バッファに10個の要素があると仮定する、positionの現在の位置は2であり、現在は6-10間のバッファデータを送信したいだけで、buffer.mark(buffer.position()は、現在のpositionをmarkに記入し、buffer.postion(6)は,このときchannelに送信されるデータが6−10のデータである.送信が完了したらbufferを呼び出すことができます.reset()はposition=markとするので,ここでのmarkは位置を一時的に記録するためのものにすぎない.Bufferを使用する場合、実際に動作するのはこの4つのプロパティの値です.Bufferクラスにはget()またはput()関数が含まれていないことが分かった.ただし、各Bufferのサブクラスにはこの2つの関数がありますが、それらが使用するパラメータタイプと、それらが返すデータ型は、各サブクラスにとって一意であるため、最上位のBufferクラスで抽象的に宣言することはできません.それらの定義は、特定のタイプのサブクラスに従う必要があります.以下、ByteBufferの簡単な使い方だけをまとめます.私は主にいくつかの例を通じてその使い方を本当に理解します.
中にデータを入れるには、次のようにします.
ここでは、私は1バイト1バイトの書き込みであり、もう1つは、大量のデータの書き込みが可能であることがわかります.次のようになります.
同じように、例えば私は「hello world」を書きます.
いずれにしても、読み上げるときは、書き込み順に読み出さなければなりません.(先書き先読み)読み出し配列を例に
驚いたことに、ここにまたlimit()が現れた.flip();clear();3つの方法は、まず最初の例で説明します.
上記の実例の説明を通じて、皆さんが理解できると信じています.私の話はあまり詳しくないかもしれませんが、この2つの方法については、ネットで検索して理解を深めることができます.また、ByteBufferがデータを読むときに、ループ読み出しと書き込みに遭遇することもあります.このときの読み出しデータのループ条件は、通常、列挙中のhasElement()と同様のremining()とhasRemining()とが用いられる.簡単な例を挙げます:私は連絡先の情報をByteBufferの中で書きたいです
次に、データを読み込みます.
上の条件remining()>20私が説明します.bufferのためです.remining()は1バイトずつ読み取り専用で、残りのデータが20バイト未満の場合に異常が発生します.以上は私がまとめたByteBufferの簡単な使い方、自己感覚について、その理解はまだ浅い状態にあるだけで、深く理解するにはまだ時間がかかります.また、個人的には、ByteBufferの読み書きについて原則に従ってまとめました.
◇バッファの4つの属性すべてのバッファには、データ要素に関する情報を提供する4つの属性があります.この4つの属性は簡単ですが、重要です.容量(Capacity):バッファに収容できるデータ要素の最大数に注意してください.この容量は、バッファの作成時に設定され、変更されません.上界(Limit):バッファの最初の読み取りまたは書き込みができない要素.バッファ作成時、limitの値はcapacityの値に等しい.capacity=1024と仮定すると、プログラムにlimit=512が設定されており、Bufferの容量は1024であるが、512以降は読み書きもできないため、Bufferの実際の利用可能なサイズは512であることが理解できる.位置(Position):次に読み書きする要素のインデックス.位置は、対応するget()関数とput()関数によって自動的に更新されます.マーク(Mark):メモの場所です.タグは設定前は未定義(undefined).使用シーンは、バッファに10個の要素があると仮定する、positionの現在の位置は2であり、現在は6-10間のバッファデータを送信したいだけで、buffer.mark(buffer.position()は、現在のpositionをmarkに記入し、buffer.postion(6)は,このときchannelに送信されるデータが6−10のデータである.送信が完了したらbufferを呼び出すことができます.reset()はposition=markとするので,ここでのmarkは位置を一時的に記録するためのものにすぎない.Bufferを使用する場合、実際に動作するのはこの4つのプロパティの値です.Bufferクラスにはget()またはput()関数が含まれていないことが分かった.ただし、各Bufferのサブクラスにはこの2つの関数がありますが、それらが使用するパラメータタイプと、それらが返すデータ型は、各サブクラスにとって一意であるため、最上位のBufferクラスで抽象的に宣言することはできません.それらの定義は、特定のタイプのサブクラスに従う必要があります.以下、ByteBufferの簡単な使い方だけをまとめます.私は主にいくつかの例を通じてその使い方を本当に理解します.
public abstract class ByteBuffer extends Buffer implements Comparable {
// This is a partial API listing
public abstract byte get( );
public abstract byte get (int index);
public abstract ByteBuffer put (byte b);
public abstract ByteBuffer put (int index, byte b);
}
// ByteBuffer , 1024 int, 1024*4
ByteBuffer buffer = ByteBuffer.allocate(1024);
中にデータを入れるには、次のようにします.
// "hey"
buffer.position();//0
buffer.put((byte)'H');//position=1
buffer.put((byte)'e');//position=2
buffer.put((byte)'y'); //position=3;
ここでは、私は1バイト1バイトの書き込みであり、もう1つは、大量のデータの書き込みが可能であることがわかります.次のようになります.
public abstract class ByteBuffer extends Buffer implements Comparable {
public ByteBuffer get(byte[] dst);
public ByteBuffer get(byte[] dst, int offset, int length);
public final ByteBuffer put(byte[] src);
public ByteBuffer put(byte[] src, int offset, int length);
}
同じように、例えば私は「hello world」を書きます.
// , byte[]
String str="hello world";
byte[] buf=str.getBytes();
buffer.put(buf);
//buffer.put(buf,0,buf.length);
いずれにしても、読み上げるときは、書き込み順に読み出さなければなりません.(先書き先読み)読み出し配列を例に
buffer.flip();
//
byte[] dc=new byte[buffer.limit()];
buffer.get(dc);
buffer.clear();
驚いたことに、ここにまたlimit()が現れた.flip();clear();3つの方法は、まず最初の例で説明します.
// "hey"
// ByteBuffer (position,limit,capacity),(0,1024,1024)
buffer.position();//(0,1024,1024)
buffer.put((byte)'H');//(1,1024,1024)
buffer.put((byte)'e');//(2,1024,1024)
buffer.put((byte)'y'); //(3,1024,1024)
buffer.flip();//(0,3,1024), position limit, limit
buffer.clear();//(0,1024,1024), , ,
上記の実例の説明を通じて、皆さんが理解できると信じています.私の話はあまり詳しくないかもしれませんが、この2つの方法については、ネットで検索して理解を深めることができます.また、ByteBufferがデータを読むときに、ループ読み出しと書き込みに遭遇することもあります.このときの読み出しデータのループ条件は、通常、列挙中のhasElement()と同様のremining()とhasRemining()とが用いられる.簡単な例を挙げます:私は連絡先の情報をByteBufferの中で書きたいです
//datas ,ContacstBean
for (int i = 0; i < datas.size(); i++) {
ContactsBean contact = datas.get(i);
// , 10
buffer.put(contact.getNumber().getBytes());
// , 20
buffer.put(contact.getName().getBytes());
}
次に、データを読み込みます.
buffer.flip();
while(buffer.remining()>20){
byte[] number=new byte[10];
byte[] name=new byte[20];
buffer.get(number);
buffer.get(name);
}
buffer.clear();
上の条件remining()>20私が説明します.bufferのためです.remining()は1バイトずつ読み取り専用で、残りのデータが20バイト未満の場合に異常が発生します.以上は私がまとめたByteBufferの簡単な使い方、自己感覚について、その理解はまだ浅い状態にあるだけで、深く理解するにはまだ時間がかかります.また、個人的には、ByteBufferの読み書きについて原則に従ってまとめました.