NIO(一)

1、NIO是什么?

  是JDK1.4之后推出的一个新的IO操作(netty、mina通讯框架的底层都是NIO实现的连接)

2、NIO和IO的区别(阻塞只会出现在网络通讯中,都是同步)

  NIO:非阻塞类型No-block-IO,通过Channel(通道)+Buffer(缓冲区)实现IO操作,NIO为双向缓冲流;数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中;

     等服务器把数据加载完过后,再去读取

  IO:阻塞类型block-IO,传统IO为单向(输入流和输出流只能执行一个)

   如果网络传输很慢,程序就会一直等待,直到传输完为止

注:JDKS1.7之后,优化:

  同步非阻塞:NIO(只有一个客户端去获取)

  异步非阻塞:AIO(可以多个客户端去获取)

3、创建测试类(NIOBufferDemo)

package com.cppdy.nio;

import java.nio.ByteBuffer;

public class NIOBufferDemo {

    public static void main(String[] args) {

        ByteBuffer buf = ByteBuffer.allocate(1024);

        System.out.println("初始化之后的信息:");
        // 当前指针位置
        System.out.println("position:" + buf.position());
        // 当前缓冲区已有的数据大小(首先要打开缓冲区)
        System.out.println("limit:" + buf.limit());
        // 缓冲区最大容量
        System.out.println("capacity" + buf.capacity());

        // 放入5个
        buf.put("cppdy".getBytes());
        System.out.println("放入值之后:");
        System.out.println("position:" + buf.position());
        System.out.println("limit:" + buf.limit());
        System.out.println("capacity" + buf.capacity());

        System.out.println("开启读之后的效果:");
        // 开启读
        buf.flip();
        System.out.println("position:" + buf.position());
        System.out.println("limit:" + buf.limit());
        System.out.println("capacity" + buf.capacity());

        byte[] bytes = new byte[buf.limit()];
        buf.get(bytes);

        System.out.println("获取到的值:" + new String(bytes, 0, bytes.length));

        System.out.println("获取值之后的效果:");
        System.out.println("position:" + buf.position());
        System.out.println("limit:" + buf.limit());
        System.out.println("capacity" + buf.capacity());

        System.out.println("开启重复读之后的效果:");
        buf.rewind();
        System.out.println("position:" + buf.position());
        System.out.println("limit:" + buf.limit());
        System.out.println("capacity" + buf.capacity());

        System.out.println("清空缓冲区之后的效果:");
        // 调用clear方法之后其实不是真正的清空缓冲区,只是把所有的信息复原而已
        buf.clear();
        System.out.println("position:" + buf.position());
        System.out.println("limit:" + buf.limit());
        System.out.println("capacity" + buf.capacity());
        System.out.println("值:" + (char) buf.get());
    }

}

 

posted @ 2018-11-29 00:41  知识追求者  阅读(205)  评论(0编辑  收藏  举报