Java NIO是Java平台中用于高效输入/输出(I/O)操作的一套新的API,与标准的Java I/O(基于流的阻塞I/O)不同,Java NIO提供了非阻塞式的I/O操作。
Java NIO 的核心组件
Java NIO主要由以下几个核心部分组成:
- Channels(通道)
- Channels是对原生的I/O对象(如文件、套接字等)的抽象表示。
- 数据可以通过Channel从一个源读取到多个缓冲区中,也可以从多个缓冲区写入到目的地。
- Channel是双向的,但是具体的Channel实现可能是单向的,例如,你只能从FileChannel中读取数据,而不能向其写入数据(除非文件是以写模式打开的)。
- Buffers(缓冲区)
- Buffer是一个对象,它包含了一个固定大小的数据数组。
- Buffer类提供了一组方法,用于操作缓冲区内的数据,如读取、写入、清空等。
- Buffer类不是线程安全的,因此,在多线程环境下使用Buffer时,需要采取适当的同步措施。
- Selectors(选择器)
- Selector允许单个线程监视多个Channel上的I/O事件。
- 你可以注册多个Channel到一个Selector上,然后调用一个阻塞方法(如select()),该方法会返回已经就绪(即可以进行I/O操作)的Channel的数量。
- Selector的引入极大地提高了非阻塞模式下处理多个Channel的能力。
示例代码
下面是一个简单的Java NIO示例,展示了如何使用FileChannel来读取文件内容:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class NIOExample {
public static void main(String[] args) {
// 创建一个文件输入流
FileInputStream fis = null;
FileChannel fileChannel = null;
try {
fis = new FileInputStream("example.txt");
fileChannel = fis.getChannel();
// 分配一个Buffer
ByteBuffer buffer = ByteBuffer.allocate(1024);
// 读取数据到Buffer中
int bytesRead;
while ((bytesRead = fileChannel.read(buffer)) != -1) {
// 切换为读模式
buffer.flip();
// 读取Buffer中的数据
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
// 切换回写模式
buffer.clear();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fileChannel != null) {
fileChannel.close();
}
if (fis != null) {
fis.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
注意:这个例子仅用于演示如何使用FileChannel和ByteBuffer来读取文件,并未涉及到Selector的使用。Selector通常用于网络编程,特别是处理多个客户端连接时非常有用。