アドレス重版: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)。