最近在学习NIO,Java NIO(New IO)是从Java1.4版本开始引入的一个新的IO API,NIO与原来的IO有相同的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的,基于通道的IO操作。NIO将以更高效的方式进行文件的读写操作。
IO和NIO的区别:
IO | NIO |
面向流 | 面向缓冲区 |
阻塞IO | 非阻塞IO |
无 | 选择器 |
Java NIO由以下几个核心部件组成:
· Buffer
· Channel
· Selector
Buffer(缓冲区)
一个用于特定基本数据类型的容器。主要用于与NIO通道进行交互,数据时从通道读入缓冲区,从缓冲去写入通道中去。
根据数据类型不同,有以下Buffer常用子类:
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
缓冲区的基本属性:
容量(capacity):表示Buffer最大数据容量,创建后不能更改
限制(limit):第一个不应该读取或写入的数据的索引,位于limit后的数据不可读写
位置(position):下一个要读取或写入的数据的索引
标记(mark)或重置(reset):标记是一个索引,通过Buffer的mark()方法指定Buffer中一个特定的position,之后可以调用reset()方法恢复到这个position
Channel(通道)
表示IO源于目标打开的连接。Channel本身不能直接访问数据,只能与Buffer进行交互。
Java为Channel接口提供的实现类:
1)FileChannel:
用于读取、写入、映射和操作文件的通道
2)DatagramChannel:
通过UDP读写网络中的数据通道
3)SocketChannel:
通过TCP读写网络中的数据
4)ServerSocketChannel:
可以监听新进来的TCP连接,对每一个新进来的连接都会创建一个SocketChannel
Selector(选择器)
可以使用一个单独的线程管理多个Channel。是非阻塞IO的核心。