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()); } }