Java NIO(New IO)是Java 1.4版本引入的一个新特性,它提供了一种不同于传统IO流的处理方式,旨在提高IO操作的效率。NIO的核心组件包括通道(Channel)和缓冲区(Buffer),这两者共同构建了一个非阻塞的IO模型。
**通道Channel**
通道类似于传统的输入/输出流,但具有以下特点:
1. **双向性**:通道可以进行读写操作,而传统的流通常是单向的(读或写)。
2. **与缓冲区结合**:通道需要与缓冲区配合工作,数据通过缓冲区在通道与程序之间传输。
3. **非阻塞**:NIO的通道支持非阻塞IO,这意味着当没有数据可读或无法写入时,线程不会被阻塞,而是返回一个状态,等待数据准备好后再继续操作。
4. **连接性**:通道可以连接到不同的数据源,如文件、套接字、网络接口等。
常见的通道类型有:
- **FileChannel**:用于文件的读写操作。
- **DatagramChannel**:处理UDP协议的数据报。
- **SocketChannel**:处理TCP连接的读写。
- **ServerSocketChannel**:监听并接受新的TCP连接请求。
**缓冲区Buffer**
缓冲区是NIO的关键组件,它是内存块的抽象,可以存储不同类型的数据(如字节、字符、整数等)。缓冲区的主要功能包括:
1. **数据存储**:缓冲区可以存储和处理数据,提供了一组方法来读写、检查和修改数据。
2. **标记和重置**:可以设置标记,用于记录当前位置,之后可以通过`reset()`方法回到标记位置。
3. ** Flip/Compact**:`flip()`方法将缓冲区从写模式切换到读模式,而`compact()`方法则清除已读数据,移动未读数据到缓冲区的前端。
4. **容量、限制和位置**:缓冲区有三个关键属性:容量(Capacity)、限制(Limit)和位置(Position)。容量是缓冲区能容纳的最大数据量,限制定义了可以读取或写入的数据范围,位置指示下一次读写操作的索引。
缓冲区的子类有:
- **ByteBuffer**:处理字节数据。
- **CharBuffer**:处理字符数据。
- **ShortBuffer**:处理短整型数据。
- **IntBuffer**:处理整型数据。
- **LongBuffer**:处理长整型数据。
- **FloatBuffer**:处理浮点型数据。
- **DoubleBuffer**:处理双精度浮点型数据。
- **MappedByteBuffer**:内存映射文件缓冲区,直接将文件映射到内存,提供高效的大文件读写。
NIO的使用通常涉及以下几个步骤:
1. 打开通道,如`FileChannel.open()`用于打开文件。
2. 创建缓冲区,如`ByteBuffer.allocate()`分配内存。
3. 将数据写入缓冲区,通过通道写入文件。
4. 使用`flip()`切换到读模式。
5. 从缓冲区读取数据,通过通道读取到其他地方。
6. 清理缓冲区,可能使用`clear()`或`compact()`。
NIO不仅适用于文件操作,还在网络编程中发挥了重要作用,例如通过SocketChannel和ServerSocketChannel处理TCP连接,以及DatagramChannel处理UDP数据报。NIO通过非阻塞特性提高了性能,减少了CPU的等待时间,特别适合于高并发的服务器端应用。同时,NIO的多路复用机制(如Selector)进一步增强了处理多个连接的能力,使得服务器可以同时处理成千上万的客户端连接。