미나 : IoBuffer 일반적인 방법 (무단 전재)

주소 재 인쇄 : https://www.cnblogs.com/zzt-lovelinlin/p/5292608.html


제한 (INT) 위치> 한계 위치 = 제한, 만약 마크> 한계 리셋 표시하면

표()

현재 위치 표시 마크의 스냅 샷을

초기화() 마크의 이전 표시로 복구 위치

명확한()

원래 데이터의 표지에 넣어 때문에 한계 = 용량, 위치 = 0, 마크를 다시 있지만, 사실은, 빈 데이터에서, 처음부터 준비를 넣어하기 위해 데이터를 버리지 말 것

되감기 () 위치 = 0, 준비 처음부터 얻기 위해, 쓰기 작업의 일련 후, 마크를 다시 설정 등) (투명 그의 독서의 대부분의 사용에 차이가 처음부터 다시 시작하는 것입니다, 가장 명확한 무거운 헤드에 사용된다 채우기에 시작, 그것은의 의미를 정리하는 것입니다
튀기다() 한계 = 위치, 위치 = 0, 쓰기 버피을 준비하기 위해 마스크를 재설정, 버피는 작업의 끝이 출력 스트림이 호출해야 할 경우, 버피가 호출됩니다 보통 또는 가능성이 위치입니다! = 제한, 후자없는 위치 데이터의 결과, 각 시각 정보가 출력 스트림에 기록되고, 그 위치 = 한계를 보장한다.
남은 () 돌아 가기 제한 위치는, 나머지 바이트 버퍼를 반환
랩 (바이트 []) 새로운 버퍼 용량 제한 = = 바이트 조립 []. 길이, 위치 = 0으로 재설정 마크
일부분() = 0 = 제한 용량은 잔존 마크 리셋, 메인 버퍼 콘텐츠 공유가 독립적으로 다른 세그먼트 버퍼, 새로운 버퍼를 형성하는 나머지 공간, 새로운 위치
복제() 버퍼, 컨텐츠 공유, 다른 독립적
asReadOnlyBuffer () 그리고 같은 중복 있지만 쓸 수 없습니다
콤팩트() 바이트 위치 및 동작 종료 buf를 본원에서 일반적 의미 압축 전경 위치 = 한계 위치에 제한 간 통화가 BUF는 출력 스트림에 기록 될 때
위치 (INT) 위치는 newPosition를 위치 = <마크 마크 재설정하면
남은 ()

한계 위치 사이에있는 바이트 수를 돌려줍니다


IoBuffer

IoBuffer 직접 NIO ByteBuffer를 사용하지 않은 내부 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 (FALSE);
   3 : // 반환 새로운 힙 버퍼.
   4 : IoBuffer BUF IoBuffer.allocate = (1,024);

IoBuffer는 자동 확장 버퍼의 생성 (선택되지 않은 NIO의 ByteBuffer의 이유 중 하나를 사용) 허용한다 속성을 설정하여 AutoExpand을 :

   1 = IoBuffer.allocate IoBuffer 버퍼 (8);
   2 : buffer.setAutoExpand (TRUE);
   삼:  
   4 : buffer.putString ( "12345678", 인코더);
   5 :        
   6 : // 버퍼에 더 많은 추가
   7 : buffer.put ((바이트) 10);

추천

출처www.cnblogs.com/huiy/p/12159830.html