【Java】 FileChannel ,Buffer介绍

好记性不如烂笔头,特将今天研究的内容记录到我的仓库

  • FileChannel 应用

对于读写文件,可能会使用到FileOutputStream、FileOutputStream , RandomAccessFile等类,他们都有一个getChannel()方法

在这里插入图片描述

例如:

// throws IOException
FileChannel channel = new FileOutputStream("data.txt").getChannel();
channel = new FileInputStream("data.txt").getChannel();
channel = new RandomAccessFile(new File("data.txt"),"rw").getChannel();

通过该方法可以获得一个FileChannel类。

在FileChannel类中主要有这几个方法, write(), read()

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ybv3DHWu-1670573925838)(FileChannel_pic/image-20221209144119428.png)]

例如:

// 写入
channel.write(ByteBuffer.wrap("use RandomAccessFile to write something.".getBytes()));

// 创建缓冲区大小
ByteBuffer buf = ByteBuffer.allocate(1024);
buf = ByteBuffer.allocateDirect(100);
channel.read(buf);
  • ByteBuffer

ByteBuffer的 allocate 和 allocateDirect区别在于

  1. 前者是将byte数组包装到非直接字节缓冲区(堆缓冲区)
  2. 而后者却是在直接字节缓冲区,操作的数据直接在内核空间,对于内存的分配和释放所需要的时间都要高于非直接字节缓冲区,但是运行效率高于非直接字节缓冲区。
  3. 因此,数据量较小的情况下使用allocate较好,反之使用allocateDirect

最后对于 buf.flip ,顾名思义,反转缓冲区。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cF1gyH95-1670573925838)(FileChannel_pic/image-20221209150140489.png)]

从源码案例部分可以看到 , buf 保存了一个数据magic,然后输入流读取该管道,通过buf.flip反转缓冲区,最后out输出流将buf内容写出。

细看

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zD6l0qe6-1670573925839)(FileChannel_pic/image-20221209154546862.png)]

ByteBuffer 继承Buffer

在Buffer的flip方法中,我们可以看到,它的底层实现是由limit,position,mark三个部分组成。

因为java没有指针的概念,因此这三个或许就是Buffer的实现核心。

可以再看看其它方法

在这里插入图片描述


在这里插入图片描述

等等,这里不列举了,最后总结以下内容:

position 表示当前有效数据的指针位置,limit表示数据有效的范围上限,mark是position指针的标记作用,capacity是整个buffer的大小。

它们的关系可以表示为: mark<=position<=limit<=capacity

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值