NIO 완충액 (버퍼)의 데이터 저장

버퍼

자바 NIO에 저장된 데이터에 대한 책임을 버퍼 (버퍼). 버퍼 배열이다. 다른 데이터 유형의 배열을 기억.

(부울 타입 제외) 데이터의 유형에 따라 대응하는 버퍼의 종류.

의 ByteBuffer (常用), CharBuffer를, ShortBuffer, IntBuffer, LongBuffer, FloatBuffer,에 Doublebuffer

버퍼 관리와 거의 동일보다도, 그들은 ()이다 버퍼 영역이 할당 가져옵니다.



데이터의 두 코어 버퍼 액세스 방법

) (입력 : 버퍼에 저장된 데이터를

() 얻기 : 데이터 버퍼를 취득



4 개 핵심 속성 버퍼

용량 : 용량이 버퍼의 최대 저장 용량은 일단 선언 변경할 수없는 나타낸다.

제한 : 제한은, 그 데이터의 버퍼 크기가 작동 될 수 나타낸다. (제한 데이터를 읽을 수없는 뒤)

위치 : 위치 데이터의 버퍼의 위치가 동작중인 나타낸다. 위치 <= 제한 <= 용량

마크 : 마크는 현재 위치의 기록 위치를 나타낸다) (단 재설정하여 마크 위치로 복원 될 수있다



데이터 버퍼를 읽기

1. 지정된 버퍼 크기를 할당

1 1024의 최대 용량

1024의 2, 경계

3, 0의 위치

1 
2
3
4
5
버퍼의 ByteBuffer ByteBuffer.allocate = ( 1,024 ); 
syso (buffer.position ());
syso (buffer.limit ());
syso (buffer.capacity ());
syso ( "-------------------------" );

2.에있어서, 상기 버퍼에 저장된 데이터에 넣어

1 1024의 최대 용량

1024의 2, 경계

3, 5 번 위치

1 
2
3
4
5
buffer.put ( "ABCDE" .getBytes ()); 
syso (buffer.position ());
syso (buffer.limit ());
syso (buffer.capacity ());
syso ( "-------------------------" );

데이터 모드 플립 방법을 읽을 3. 스위치

1 1024의 최대 용량

2/5, 제한

3, 0의 위치

1 
2
3
4
5
buffer.flip (); 
syso (buffer.position ());
syso (buffer.limit ());
syso (buffer.capacity ());
syso ( "-------------------------" );

4. GET 버퍼를 이용하여 데이터를 판독하는 방법

1 1024의 최대 용량

2/5, 제한

3, 5 번 위치

1 
2
3
4
5
6
7
바이트 [] = 의해 새로운  바이트 [buffer.limit ()]; 
(가) buffer.get;
syso ( 새로운 문자열 (기준, 0 , by.length));
syso (buffer.position ());
syso (buffer.limit ());
syso (buffer.capacity ());
syso ( "-------------------------" );

판독 데이터가 되감기를 사용하여 반복된다

1 1024의 최대 용량

2/5, 제한

3, 0의 위치

1 
2
3
4
5
buffer.rewind (); 
syso (buffer.position ());
syso (buffer.limit ());
syso (buffer.capacity ());
syso ( "-------------------------" );

6. 빈 버퍼는, 상기 버퍼 데이터를 상태 데이터 잊어, 여전히

1 1024의 최대 용량

1024의 2, 경계

3, 0의 위치

1 
2
3
4
5
buffer.clear (); 
syso (buffer.position ());
syso (buffer.limit ());
syso (buffer.capacity ());
syso ( "-------------------------" );



버퍼 마크 (마커)이 사용될

위치의 현재 위치를 표시하도록 표시 () 메소드

초기화 () 메소드는 마커 위치의 위치로 복귀

1 
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

= 문자열 문자열 "ABCDE" ;
의 ByteBuffer 버퍼 ByteBuffer.allocate = ( 1,024 );
buffer.put (하는 String.getBytes ());
//가 판독 모드로 전환
(;) buffer.flip를
바이트 에 의한 [] = 새로운 새 바이트 [버퍼 으로 제한 할 ()];
buffer.get (의해 0 , 2 )
syso (buffer.position ()); // 2 개의 결과
// 마크 마커
buffer.mark ();
buffer.get (의해, 2 , 2 ) ;
syso (buffer.position ()); // 결과 4
하여 마크 위치를 복원 리셋 //
buffer.reset ();
syso (buffer.position ()); // 결과



버퍼의 조각 방법

공통 데이터 조각에있어서 단지 하나, 또는 기존 버퍼 sliceBuffer을 수정하여 만든이 sliceBuffer 다른 버퍼에 반영 될 것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ByteBuffer byteBuffer=ByteBuffer.allocate(10);
//放入数据到byteBuffer
for(int i = 0; i< byteBuffer.capacity(); ++i){
byteBuffer.put((byte)i);
}
byteBuffer.position(2);
byteBuffer.limit(6);
//创建sliceBuffer,修改sliceBuffer上的值为原来的2倍
ByteBuffer sliceBuffer=byteBuffer.slice();
for(int i=0;i<sliceBuffer.capacity();++i){
byte b = sliceBuffer.get(i);
sliceBuffer.put(i, (byte) (2*b));
}
byteBuffer.position(0);
byteBuffer.limit(byteBuffer.capacity());
//查看byteBuffer上的值的变化
while(byteBuffer.hasRemaining()){
System.out.println(byteBuffer.get());
}

程序运行结果

IMG



只读Buffer

我们可以随时将一个普通Buffer调用asReadOnlyBuffer方法返回一个只读Buffer,但不能将只读Buffer转换为一个读写Buffer

1
2
3
4
5
ByteBuffer byteBuffer=ByteBuffer.allocate(10);
for(int i=0;i<byteBuffer.capacity();++i){
byteBuffer.put((byte)i);
}
ByteBuffer readonlyBuffer=byteBuffer.asReadOnlyBuffer();



直接缓冲区和非直接缓冲区

非直接缓冲区:通过allocate() 方法分配缓冲区,将缓冲区建立在JVM的内存中。

直接缓冲区:通过allocateDirect() 方法分配直接缓冲区,将缓冲区建立在操作系统的物理内存中,可以提高效率。

非直接缓冲区

IMG

직접 버퍼

IMG

원본 : 큰 상자  NIO 버퍼 (버퍼) 데이터 저장


추천

출처www.cnblogs.com/wangziqiang123/p/11642079.html