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());
buffer.flip();
while(buffer.hasRemaining()){
byte b = buffer.get();
System.out.println(b);
}
}
}
Demo02
package cn.tedu.buffer;
import java.nio.ByteBuffer;
public class ByteBufferDemo2 {
public static void main(String[] args) {
ByteBuffer buffer = ByteBuffer.allocate(10);
buffer.put("hello".getBytes());
byte[] data = buffer.array();
buffer.flip();
System.out.println(new String(data, 0,
buffer.limit())</