NIO의, 자바 프로그래밍 기초

첫째, 무엇 NIO입니다

채널 및 버퍼 (채널 버퍼) 1.NIO는 IO의 API의 표준 자바 API의 IO에 대한 가능한 대안 (자바 1.4부터) NIO 다른 표준 IO IO 작업, NIO 제공

두, IO와 NIO 대조

IO

NIO

스트림 지향

버퍼 지향

IO 차단

차단 IO

아니오

선택자

 

세 버퍼 데이터 액세스

NIO 버퍼 주로 NIO 채널과 상호 작용을 위해, 데이터가 버퍼로 채널로부터 판독되는 1.java는 버퍼 배열 등에 기록 채널 버퍼는 동일한 유형의 데이터를 복수 저장할 수있다. 유형 (부울 제외)에 따라 다음과 같은 서브 클래스 버퍼를 사용 :

의 ByteBuffer

CharBuffer를

ShortBuffer

IntBuffer

LongBuffer

FloatBuffer

에 Doublebuffer

2.buffer 개요

1) 용량 (용적) 버퍼는 제외 될 수없는 용량 버퍼의 최대 데이터 용량을 나타내며 설립 변형 될 수 없다.

2) 제한 (한계), 제 1 인덱스를 읽거나, 즉, 데이터가 기록 제한 뒤에 위치 할 수없는 데이터가 기록되지 않아야한다. 버퍼가 음수가 될 수없는 제한 및 용량 (용량)보다 더 클 수 없다.

3) 위치 (위치)의 인덱스 데이터를 다음 판독 또는 기록. 버퍼 위치가 음수 일 수 없으며 그 제한 (한계)보다 클 수 없다.

4) 마크 (마크) 및 리셋 (초기화)이 마크가 버퍼 버퍼의 특정 위치를 지정하기 위해 마커 인덱스 () 방법은,이 위치로 리셋 () 메소드를 호출하는 것에 의해 회복 될 수있다.

3. 코드

/**
 * (缓冲区)buffer 用于NIO存储数据 支持多种不同的数据类型 <br>
 * 1.byteBuffer <br>
 * 2.charBuffer <br>
 * 3.shortBuffer<br>
 * 4.IntBuffer<br>
 * 5.LongBuffer<br>
 * 6.FloatBuffer <br>
 * 7.DubooBuffer <br>
 * 上述缓冲区管理的方式 几乎<br>
 * 通过allocate() 获取缓冲区 <br>
 * 二、缓冲区核心的方法 put 存入数据到缓冲区 get <br> 获取缓冲区数据 flip 开启读模式
 * 三、缓冲区四个核心属性<br>
 * capacity:缓冲区最大容量,一旦声明不能改变。 limit:界面(缓冲区可以操作的数据大小) limit后面的数据不能读写。
 * position:缓冲区正在操作的位置
 */
public class test001 {
    public static void main(String[] args) {
        //1.指定缓冲区的大小1024
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
        System.out.println("-------------------");
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        // 2.向缓冲区存放5个数据
        byteBuffer.put("abcd1".getBytes());
        System.out.println("--------------------");
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        // 3.开启读模式
        byteBuffer.flip();
        System.out.println("----------开启读模式...----------");
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        byte[] bytes = new byte[byteBuffer.limit()];
        byteBuffer.get(bytes);
        System.out.println(new String(bytes, 0, bytes.length));
        System.out.println("----------重复读模式...----------");
        byteBuffer.rewind();
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        byte[] bytes2 = new byte[byteBuffer.limit()];
        byteBuffer.get(bytes2);
        System.out.println(new String(bytes2, 0, bytes2.length));
        // 5.clean 清空缓冲区  数据依然存在,只不过数据被遗忘
        System.out.println("----------清空缓冲区...----------");
        byteBuffer.clear();
        System.out.println(byteBuffer.position());
        System.out.println(byteBuffer.limit());
        System.out.println(byteBuffer.capacity());
        System.out.println((char)byteBuffer.get());
    }
}

4. 결과

-------------------
0
1024
1024
--------------------
5
1024
1024
----------开启读模式...----------
0
5
1024
abcd1
----------重复读模式...----------
0
5
1024
abcd1
----------清空缓冲区...----------
0
1024
1024
a

5. 분석

5.1.이 단계는 실제로 우리가 처음이 버퍼 배열 초기화 시간을 시작했을 때입니다,이 기본 시작이다

 5.2. 그러나 당신이 다음과 같은 차트 될 때 몇 바이트를 쓰기 시작하는 배열을 버퍼 갈 때, 위치 데이터의 마지막의 다음 위치로 이동합니다.

5. 3.이 시간, 그래서 우리는 당신이 메서드를 호출을 완료 할 때이 byteBuffer.flip () 메소드를 사용할 필요가, 파이프 라인의 채널 데이터 버퍼를 작성해야이 시간,이 시간은 다음이 될 것이다 당신이 실제로 당신이 단지 위치에 버퍼 데이터에 기록 된 것을 알 수 있도록지도, ----> 한계 사이 (반복 읽기의 결과는 동일).

5.4.이 경우 기본 운영 체제는 데이터의이 다섯 바이트가 제대로 버퍼에서 발송 읽을 수 있습니다. 우리는 분명히 () 메서드에 다음 조정에 데이터를 작성하기 전에. 인덱스 버퍼 상태가 초기 위치로 복귀하고있다.

네, 나머지의 메이크업 사용

1. 마크 (마크) 및 초기화 (리셋) 마크가 버퍼 버퍼의 특정 위치를 지정하기 위해 마커 인덱스 () 메소드이고,이 위치의 리셋 () 메소드를 호출하는 것에 의해 회복 될 수있다.

2. 코드

public class Test002 {
    public static void main(String[] args) {
        ByteBuffer buf = ByteBuffer.allocate(1024);
        String str = "abcd1";
        buf.put(str.getBytes());
        // 开启读取模式
        buf.flip();
        byte[] dst = new byte[buf.limit()];
        buf.get(dst, 0, 2);
        buf.mark();
        System.out.println(new String(dst, 0, 2));
        System.out.println(buf.position());
        System.out.println("---------------------------");
        buf.get(dst, 2, 2);
        System.out.println(new String(dst, 2, 2));
        System.out.println(buf.position());
        buf.reset();
        System.out.println("重置恢复到mark位置..");
        System.out.println(buf.position());
    }
}

3. 결과

ab
2
---------------------------
cd
4
重置恢复到mark位置..
2

다섯째, 말

1. 보안 및 직접 비 다이렉트 버퍼 버퍼 사이의 차이의 기초를 설명 NIO 다음 프로그래밍 자바를 계속합니다. 항상 믿음을 유지!

게시 된 122 개 원래 기사 · 원 찬양 64 ·은 50000 +를 볼

추천

출처blog.csdn.net/chenmingxu438521/article/details/103967066