一、Java NIO
(一)NIO概述
是从 Java 1.4 版本开始引入的一个新的 IO 流,与原来的 IO 有同样的作用和目的,但是使用的方式完全不同, NIO 支持面向缓冲区的、基于通道的 IO 操作。 NIO 将以更加高效的方式进行文件的读写操作。
(二)Java NIO 与 IO 的主要区别
IO | NIO |
---|---|
面向流(StreamOriented) | 面向缓冲区(BufferOriented) |
阻塞IO(BlockingIO) | 非阻塞IO(NonBlockingIO) |
(无) | 选择器(Selectors) |
(三)缓冲区 (Buffer) 和通道 (Channel)
简而言之, Channel 负责传输, Buffer 负责存储
一个用于特定基本数据类型的容器。由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类。
由 java.nio.channels 包定义的。 Channel 表示 IO 源与目标打开的连接。
Channel 类似于传统的“流”。只不过 Channel本身不能直接访问数据, Channel 只能与Buffer 进行交互。
Java NIO 中的 Buffer 主要用于与 NIO 通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中的。
缓冲区存取数据的两个核心方法:
- put() : 存入数据到缓冲区中
- get() : 获取缓冲区中的数据
- flip(); 切换读取数据模式
- rewind() : 可重复读
- clear() : 清空缓冲区. 但是缓冲区中的数据依然存在,但是处于“被遗忘”状态
- mark() : 标记是一个索引,通过 Buffer 中的 mark() 方法
// Buffer 缓冲区中几个重要的属性
//capacity; 缓冲区的最大容量
//position 读取数据是,具体位置
//limit; 界限
// mark 书签,标记,可以记录 position 可以通过一个方法,会到我刚才标记的位置
//容器:有两个方法,可以写入数据和读取数据
//定义一个缓冲区 容量为10
String str = "abcde";
ByteBuffer byteBuffer = ByteBuffer.allocate(10);
System.out.println("capacity:" + byteBuffer.capacity());
System.out.println("position:" + byteBuffer.position());
System.out.println("limit:" + byteBuffer.limit());
System.out.println("------------put()--------------------");
byteBuffer.put(str.getBytes());
System.out.println("capacity:" + byteBuffer.capacity());
System.out.println("position:" + byteBuffer.position());
System.out.println("limit:" + byteBuffer.limit());
//容器中放了数据后,我想读取数据,我们要切换成读取模式