- 基本步骤:
- 打开文件通道:通过
FileInputStream
或RandomAccessFile
获取对应的FileChannel
。
- 创建缓冲区:创建合适大小的
ByteBuffer
。
- 从通道读取数据到缓冲区:调用通道的
read
方法将数据读入缓冲区。
- 处理缓冲区数据:对缓冲区中的数据进行处理,处理前可能需要切换缓冲区状态(例如从写模式切换到读模式)。
- 关键代码示例:
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class NIOFileReadExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.txt");
FileChannel channel = fis.getChannel()) {
// 创建ByteBuffer
ByteBuffer buffer = ByteBuffer.allocate(1024);
// 从通道读取数据到缓冲区
int bytesRead = channel.read(buffer);
while (bytesRead != -1) {
buffer.flip(); // 切换到读模式
while (buffer.hasRemaining()) {
System.out.print((char) buffer.get());
}
buffer.clear(); // 清空缓冲区,准备下一次读取
bytesRead = channel.read(buffer);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
- Channel和Buffer之间的协作关系:
Channel
负责从数据源(如文件)读取数据或向目标(如文件)写入数据,它本身不存储数据,而是充当数据传输的管道。
Buffer
则用于存储从Channel
读取的数据或准备写入Channel
的数据。当从Channel
读取数据时,数据被填充到Buffer
中;当向Channel
写入数据时,数据从Buffer
中取出。Buffer
有自己的状态管理(如容量、位置、限制等),例如flip
方法用于切换缓冲区从写模式到读模式,clear
方法用于重置缓冲区状态以便再次写入数据,这些状态操作对于正确处理数据至关重要,而Channel
通过与Buffer
交互来完成数据的传输。