ミナ:IoBuffer一般的な方法(転載)

アドレス重版:https://www.cnblogs.com/zzt-lovelinlin/p/5292608.html


リミット(INT) もし位置>限界、位置=リミット、マーク>限界、リセットマークもし

マーク()

現在位置マークマークのスナップショットを取ります

リセット() マークの前のマークへのリカバリ位置

晴れ()

リミット=容量、位置= 0、マークをリセットしていますが、元のデータのカバーに入れているため、実際には、ゼロから準備を置くために、空のデータを、データを空にしていないが

巻き戻し() 位置= 0、準備するために最初から取得するためには、書き込み操作の一連の後、マークをリセットし、クリアな()彼の読書のほとんどの使用に異なりがゼロからスタートすることで、最も明確な重いヘッドに使用されていますそれはの意味をクリーンアップすることで、埋めるために開始されます
フリップ() リミット=位置、位置= 0、マスクをリセットし、書き込みBUFへの準備ができているために、bufが通常操作の最後で、bufが、これが呼び出され、または可能性が高い位置でなければなりません、ときに出力ストリームと呼ばれます!=リミット、後者のない位置データをもたらす、データを出力ストリームに書き込まれるたびに、位置=制限することを保証しなければなりません。
残り() バック限界位置は、残りのバイトのバッファを返します
ラップ(バイト[]) 新しいバッファ、容量=リミット=バイトを組み立てる[]。長さ、位置= 0リセットマーク
スライス() 互いに独立のセグメンテーション・バッファ、新しいバッファ、新しい位置= 0、上限=容量=残り、マークリセット、メインバッファのコンテンツ共有を形成する残りの空間、
重複() バッファ、コンテンツ共有、他の独立
asReadOnlyBuffer() およびそれを複製しますが、書き込むことはできません
コンパクト() バイト位置及び動作終了bufを一般に本明細書で意味圧縮さ前景、位置=限界位置にリミットとの間の呼は、BUFは、出力ストリームに書き込まれるとき
位置(INT) 位置= newPosition、位置であれば、<マーク、マークのリセット
残り()

限界位置との間のバイト数を返します


IoBuffer

IoBufferは直接のByteBuffer NIOを使用していない内部使用MINA、MINAのバッファのバイトです。しかしIoBufferはのByteBufferのパッケージです。多くの点でIoBufferはByteBufferのへの直接の後継です。ByteBufferはちょうどいくつかの拡張機能に、より実用的なアプローチを追加しました。

基本的な使い方

IoBufferは仁王さんのByteBufferのパッケージなので、基本的な概念は簡単な以下の、まだ同じですので。

1、容量は:この属性は、バッファを作成するとき、この値が指定され、バッファは、記憶素子の最大数であり、バッファリングできるバッファ内の要素の最大数を記載し、そして変更することができません。

2、リミット:チャンネルにバッファからデータを書き込む際に、リミット変数は、データがバッファへのチャンネルから読み込まれたときに、読むことができます残っているどのくらいのデータを示し、リミット変数は、利用可能な残っているどのくらいのストレージ容量を示していますデータ。これは、制限の下で通常の位置以下です。

3、Position:Buffer实际上也就是个array。当你从Channel中读数据时,你把从Channel中读出来的数据放进底层array,position变量用来跟踪截止目前为止已经写了多少数据。更精确的讲,它指示如果下次写Buffer时数据应该进入array的哪个位置。因此如果已经从Channel中读出了3个字节,Buffer的position会被置为3,指向array中第四个位置。

4、Mark:一个可以记忆的Position位置的值,在调用reset()方法时会将缓冲区的Position重置为该索引,并非总是需要定义Mark,但是在定义Mark时,不能将其定义为负数,并且不能让它大于Position,如果定义了Mark,则在该Position或Limit调整为小于该Mark值时,该Mark将被丢弃。

下面通过一个例子来说明:

i、初始状态下:

此时position为0,limit和capacity都被设为9;

画像

ii、从Channel中读入4个字节数据到Buffer,这时position指向4(第5个):

画像

iii、在做写操作之前,我们必须调用一次flip()方法,这个方法做了两件重要的事情:
1. 将limit设置到当前的position处。
2. 设置position为0。

画像

iiii、执行写操作后;

画像

iv、执行clear后,position设为0,limit设为capition,mark则丢弃;

画像

因为IoBuffer是一个抽象类,不能直接实例化,所有使用的时候需要调用allocate方法来进行内存分配;

allocate有两种定义:

   1: // Allocates a new buffer with a specific size, defining its type (direct or heap)
   2: public static IoBuffer allocate(int capacity, boolean direct)
   3:  
   4: // Allocates a new buffer with a specific size
   5: public static IoBuffer allocate(int capacity)

这里:

capacity:buffer的大小;

direct:如果为true,则得到direct buffer,如果为false,则得到heap buffer

direct buffer和heap buffer的区别分析:

Direct Buffer不是分配在堆上的,它不被GC直接管理(但Direct Buffer的JAVA对象是归GC管理的,只要GC回收了它的JAVA对象,操作系统才会释放Direct Buffer所申请的空间),它似乎给人感觉是“内核缓冲区(buffer in kernel)”。Heap Buffer则是分配在堆上的,或者我们可以简单理解为Heap Buffer就是byte[]数组的一种封装形式。当我们把一个Heap Buffer写入Channel的时候,实际上底层实现会先构建一个临时的Direct Buffer,然后把Heap Buffer的内容复制到这个临时的Direct Buffer上,再把这个Direct Buffer写出去。因此把一个Direct Buffer写入一个Channel的速度要比把一个Heap Buffer写入一个Channel的速度要快。但是Direct Buffer创建和销毁的代价很高,所以要用在尽可能重用的地方。

public static IoBuffer allocate(int capacity)的用法:
   1:ヒープバッファにここに割り当てられ//設定されたデフォルトの型が割り当てられます。
   2:IoBuffer.setUseDirectBuffer(偽);
   3://は、新しいヒープバッファを返します。
   4:IoBuffer BUF = IoBuffer.allocate(1024)。

IoBufferは(NIOのByteBufferの理由のいずれかを使用するように選択されていない)自動拡張バッファの生成を可能にし、プロパティを設定することにより、自動拡張:

   1:IoBufferバッファー= IoBuffer.allocate(8)。
   2:buffer.setAutoExpand(TRUE)。
   3:  
   4:buffer.putString( "12345678"、エンコーダ)。
   5:        
   6://このバッファにさらに追加
   7:buffer.put((バイト)10)。

おすすめ

転載: www.cnblogs.com/huiy/p/12159830.html
おすすめ