NIO : 버퍼의 ByteBuffer 방법을 설명

       NIO가 느린 일반 IO 효율의 문제를 해결하기 위해, JDK1.4 이후에 도입되었다. 가장 시간이 많이 걸리는 NIO IO 작업 (추출 버퍼 작성) 효율성을 크게 향상시킬 수 있으므로이 작업을 완료하기 위해 운영 체제를 허용, 다시 운영 체제로 전송합니다. NIO 데이터는 블록 단위로 처리되고, 기존 IO는 NIO 너무 빨리 바이트이다.
       NIO는, 채널, 우리는 직접 읽고 채널에서 데이터를 작성하지 IO 스트림 기존의 아날로그, 운영 시스템 채널 및 직접 도킹 할 수 있지만 버퍼를 통해 수있는 채널 채널을 통해 데이터를 읽고 작성하는 것입니다 지역 버퍼. 데이터를 판독 할 때, 상기 채널은 데이터로부터 직접 판독하지만, 그 버퍼에 상기 채널로부터의 데이터, 및 상기 버퍼로부터 데이터를 취할 수 없다. 동일한 데이터가 캐시를 통해 채널로 기록 작성합니다.
       우리가해야 할 일은 우선으로 거래이다 버퍼 버퍼가 실제로 특정 패키지에 배열, 그래서 전체 프로세스보다 편리. 자바 클래스 버퍼를 제공하는 서브 클래스 등의 ByteBuffer, CharBuffer를 각 기본 데이터 타입 (부울 제외) 해당 버퍼 유형이 사용시 사용되는 버퍼이다.
       의 당신의 ByteBuffer에 예를 들어, 사용하는 방법을 살펴 보자
마크, 위치, 리밋트, 용량 : 말을 먼저 할 일은 네 가지 속성입니다
표시가 리셋 방법의 위치를 표시하기 위해 다시 위치를 수 호출, 마크 인
위치를 현재의 위치입니다, 포인트 버퍼 배열
제한 포인터가 한계 위치에 버퍼되어 읽기 및 쓰기에 의해 제한되고, 한계를 초과 할 수없는
능력은 현재의 캐시 크기의 용량
네 마크 포인터 사이의 관계는 <= 위치 <= 제한 <= 용량
네 사용하는 방법이보고 여러 작업은 몇 가지 예는 이해하기
초기화

//ByteBuffer是通过分配内存来初始化的,这样就会new出来一个子类HeapByteBuffer,在堆上创建该对象
//感兴趣的看看源码
//分配缓冲区空间:创建一个字节缓冲区,申请内存空间为8字节
ByteBuffer byteBuffer = ByteBuffer.allocate(8);
//在堆外创建对象,不受垃圾回收的限制
ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
//通过字节数组初始化ByteBuffer对象
public static ByteBuffer wrap(byte[] array,int offset, int length)
public static ByteBuffer wrap(byte[] array)

여기에 그림 삽입 설명
여기에 그림 삽입 설명
여기에 그림 삽입 설명
데이터 쓰기

//向缓冲区中写入一个字节数据
//还有其他重载方法:指定位置向缓冲中添加字节,向缓存中添加字节数组,向缓存中添加另外一个缓存
 byteBuffer.put((byte)10);
 //指定位置向缓冲区中添加字节,在3号位置添加10
 byteBuffer.put(3,(byte)10);
 //向一个缓存中添加另外一个缓存
 byteBuffer2.put(byteBuffer);

필요 에 유의 지정된 인덱스가 추가 될 인덱스를 지정하지 않은 위치 위치 위치 위치에 변화가 발생하지 않습니다 요소를 추가 한
여기에 그림 삽입 설명
여기에 그림 삽입 설명
캐시를 얻기 위해 값을

//获取缓冲中的数据,通过获取index位置的数据
byte b = byteBuffer.get(index);
//不指定索引获取缓冲数据

또한 주의 인덱스를 지정하지 않은 즉, 지정된 위치 데이터에 대한 액세스 위치 위치에 변화가 발생하지 않습니다 위치 위치에 변화를 야기
얻을 작업 소스 :
여기에 그림 삽입 설명
몇 가지 기능이에 관하여 알 필요가 있습니다

position():返回当前position的值
limit():返回当前limit的值
capacity():返回当前capacity的值
hasRemaining():返回position和limit之间是否有元素 即: return position < limit
remaining():返回position和limit之间的元素数  即:return limit - position

위의 세 가지 속성을 이해하는 예로서 함께 할 것입니다

public class NIO_Demo {
    public static void main(String[] args) {
        //分配缓冲区空间:创建一个字节缓冲区,申请内存空间为8字节
        ByteBuffer byteBuffer = ByteBuffer.allocate(8);
        //向缓冲区中写入数据
        byteBuffer.put((byte)10);
        byteBuffer.put((byte)20);
        byteBuffer.put((byte)30);
        byteBuffer.put((byte)40);
        //输出三个状态
        System.out.println("position:"+byteBuffer.position());
        System.out.println("limit:"+byteBuffer.limit());
        System.out.println("capacity:"+byteBuffer.capacity());

        //hasRemaining()告知在当前位置和限制之间是否有元素
        if(byteBuffer.hasRemaining()) {
            //remaining()返回当前位置与限制之间的元素数
            for (int i = 0; i < byteBuffer.remaining(); i++) {
                byte b = byteBuffer.get(i);
                System.out.println(b);
            }
        }
    }
}

여기에 그림 삽입 설명
당신이 4 번 위치에 이미 4 개의 기록 된 바이트의 수, 위치를 볼 수 있습니다 때 메모리 할당의 8 바이트는, 다음 제한이 왜, 사용은 무엇입니까 8이기 때문에, 용량은 8 잘 이해된다?
제한 때문에 지금은 4-8에서,하지만 왜 필요가 커널 공간, 한계 위치에서 데이터의 유효 범위에 캐시 데이터를 쓸 때, 대중 교통 포인터는 그것이 말하는 제한이 4 분명하다 : 역할을 -8 데이터입니다, 0-4의 데이터는이 시간 제한은 작동하지만 함수 플립를 호출해야

flip():反转此缓冲区   操作很简单: limit=position,position=0

이 기능을 실행 한 후 그 정확한 값을 얻을 수있다.
또한 상기 실시 예

        System.out.println("position:"+byteBuffer.position());
        System.out.println("limit:"+byteBuffer.limit());
        System.out.println("capacity:"+byteBuffer.capacity());
        //缓冲区的反转:转为有效数组   limit=position position=0 有效数据为position-limit
        byteBuffer.flip();
        //输出三个状态
        System.out.println("position:"+byteBuffer.position());
        System.out.println("limit:"+byteBuffer.limit());
        System.out.println("capacity:"+byteBuffer.capacity());

여기에 그림 삽입 설명

추천

출처blog.csdn.net/weixin_42220532/article/details/90489461