1、简介
1.1 Java中的IO介绍
BIO:BlockingIO,同步式阻塞式IO,即传统的IO,是java中最早期的流
NIO:Non-BlockingIO,又称New IO,同步式非阻塞IO,是JDK1.4提供的流
AIO:AsynchronousIO,异步是非阻塞IO,可以认为是NIO的二代版本,是JDK1.8提供的流
1.2 概述
NIO是JDK1.4出现的一个新的用于进行数据传输的流
全称是Non-BlockingIO,是一种同步式非阻塞式的IO,也是一种能供进行多路复用的IO
NIO中有3大组件:Buffer、Channel、Selector
NIO在使用的时候可以基于事件驱动方式来实现
1.3 BIO的缺点
一对一的连接方式:即每一个连接请求对应一个线程,在请求最大的情况下,会导致服务器端的压力非常大而致整个服务器的效率变低
阻塞:当线程在进行read或者write的时候,除非读完或者写完,否则在这个过程中不能发生任何操作
单项传输:数据只能从一端传向另一端,如果需要反向传输需要令创建流对象
1.4 NIO的特点
一对多的连接方式:利用一个或者少量线程处理大量的连接请求,降低服务器端的压力
非阻塞:在线程不能进行read或者write方法的时候,立即返回0,等待下一次操作
双向传输:利用通道可以实现数据的双向
1.5 NIO的缺点
在请求量比较大的情况下会出现部分请求的响应时间比较长的现象
不适用于长任务场景,不然会导致其他的请求无法处理
1.6 BIO和NIO的比较
图片
2. ByteBuffer
2.1 概述
字节缓冲区,继承了Buffer类
底层是依靠字节数组来存储数据
本身是一个抽象类,需要利用其子类创建对象或者是利用其提供的allocate或者wrap方法来创建ByteBuffer对象
重要位置:capacity >= limit >= position >=mark
2.2 重要位置
capacity:容量位,用于标记该缓冲区的容量,在缓冲区创建好之后就不再改变
limit:限制位,用于限制操作位position所能达到的最大位置。在缓冲区刚创建的时候指向容量位
position:操作位,用于指向要操作的位置,实际意义类似于数组中的下标,在缓冲区刚创建的时候指向0
mark:标记位,用于进行标记,在缓冲区刚创建的时候指向-1,默认不启用
2.3 重要方法
2.4 示例
Demo01
package cn.tedu.buffer;
import java.nio.ByteBuffer;
public class ByteBufferDemo {
public static void main(String[] args) {
// 表示给底层的字节数组来指定大小
// 缓冲区在给定之后,长度就不能改变了
ByteBuffer buffer =
ByteBuffer.allocate(10);
// 添加数据
buffer.put("abc".getBytes());
buffer.put((byte) 0);
buffer.put("def".getBytes());
// 将position挪动
// buffer.position(0);
// 获取元素
// 获取的是一个字节
// byte b = buffer.get();