推荐关注公众号:锅外的大佬
每日推送国外技术好文,帮助每位开发者更优秀地成长
译者:Leesen
1.概述
在这篇速学教程中,我们将研究Java NIO库中提供的FileChannel类,讨论如何使用FileChannel和ByteBuffer读写数据,探讨使用FileChannel以及其他文件操作特性的优点。
2.FileChannel的优点
FileChannel的优点包括:
在文件特定位置进行读写操作
将文件一部分直接加载到内存,这样效率更高
以更快的速度将文件数据从一个通道传输到另一个通道
锁定文件的某一部分来限制其他线程访问
为了避免数据丢失,强制立即将更新写入文件并存储
3.FileChannel读操作
当我们读取一个大文件时,FileChannel比标准I/O执行得更快。需要注意,虽然FileChannel是Java NIO的一部分,但是FileChannel操作是阻塞的,并且没有非阻塞模式。
3.1.使用FileChannel读取文件
先了解如何使用FileChannel读取一个文件,该文件包含:
Hello world
下面测试读取文件,并检查是否ok:
@Test
public void givenFile_whenReadWithFileChannelUsingRandomAccessFile_thenCorrect()
throws IOException {
try (RandomAccessFile reader = new RandomAccessFile("src/test/resources/test_read.in", "r");
FileChannel channel = reader.getChannel();
ByteArrayOutputStream out = new ByteArrayOutputStream()) {
int bufferSize = 1024;
if (bufferSize > channel.size()) {
bufferSize = (int) channel.size();
}
ByteBuffer buff = ByteBuffer.allocate(bufferSize);
while (channel.read(buff) > 0) {
out.write(buff.array(), 0, buff.position());
buff.clear();
}
String fileContent = new String(out.toByteArray(), StandardCharsets.UTF_8);
assertEquals("Hello world", fileContent);
}
}
这里使用