Java中文件NIO操作-读文件
程序员文章站
2022-04-24 11:06:29
...
Java NIO要点
1.通道 (Channel)
2.缓冲区(Buffer)
参考 nio的实现原理
实现
Java用NIO读文件
String path = "G:\\MyDesktop\\Example\\test.txt";
File file = new File(path);
FileInputStream fis = new FileInputStream(file);
// 创建一个通道
FileChannel fc = fis.getChannel();
// 创建缓冲区,分配大小1024
ByteBuffer buffer = ByteBuffer.allocate(1024);
// 从通道读入缓冲区
fc.read(buffer);
buffer.flip();
// 打印缓冲区的内容
while(buffer.hasRemaining()) {
System.out.print((char)buffer.get());
}
思考
以上代码实现中,缓冲区分配的大小是1024,而通道的大小是与文件大小一样的。即:
file.length() == fc.size() // true
如果要读的文件[fc.size()]大于缓冲区的1024,通道里面多出来的数据要怎么读?
通道的position()
通道的position与缓冲区的作用一样
/*
* 返回当前读取的位置
*/
public abstract long position() throws IOException;
/*
* 改变读取位置
*/
public abstract FileChannel position(long newPosition) throws IOException;
简单实现循环读取通道中的数据
String path = "G:\\MyDesktop\\Example\\test.txt";
File file = new File(path);
FileInputStream fis = new FileInputStream(file);
// 创建一个通道
FileChannel fc = fis.getChannel();
// 创建缓冲区,分配大小1024
ByteBuffer buffer = ByteBuffer.allocate(1024);
StringBuilder builder = new StringBuilder();
// 循环条件 position < size
while (fc.position() < fc.size()) {
// 每次循环先清空缓冲区
buffer.clear();
// 根据position读取通道数据到缓冲区
int read = fc.read(buffer, fc.position());
// 更新通道的position
fc.position(fc.position() + read);
// 打印缓冲区的内容
buffer.flip();
while(buffer.hasRemaining()) {
// builder.append((char)buffer.get());
System.out.print((char)buffer.get());
}
}
// String string = builder.toString();
// System.out.println(string);
上一篇: Netty 入门demo
下一篇: C# 枚举类型的转换