通过RandomAccessFile对文件 删除,修改,新增

RandomAccessFile类

该类通过提供指针的方式操作文件,文件可以看作byte数组,通过指针来修改对于位置的数据

按一定条件删除文件中 一组数据

原理是:用后面有效的数据覆盖掉要删除的数据,最后让文件从末尾丢弃掉删除数据的长度
RandomAccessFile.setLength(long length) 来设置文件的大小
原来文件
在这里插入图片描述
通过覆盖数据的方法实现删除功能:覆盖后
在这里插入图片描述
RandoAccessFile.setLength(long length) 后得到最终文件
在这里插入图片描述

例如删除f1.txt文件中 dev103的一组数据

该文件结构是 一组数据共8行 首行有dev+ID 信息
dev+ID为唯一标识 只会在这组数据中出现,且必定出现在改组数据首行

有了上面的约束,就可以进行按行遍历,然后进行修改
在这里插入图片描述

代码实现

在这里插入图片描述
在这里插入图片描述

其中line.separator 是换行符 不同操作系统各不相同,让jvm去自动获取.
length为该文件的总长度(byte的大小)
writepointer 和readpointer为读写指针,这里没用到读指针
int c=7 为该数据组特征值.因为一组数据有8行,第一行用来判断是否为目标数据,还剩7行
while循环开始按行遍历文件,每一行的数据存贮到String line中,注意:我的文件中不存在中文,所以读的时候没有按照某种字符集解码
当line中含有 目标 dev103时,进行删除操作:
在这里插入图片描述
1.进入这个语句时指针在如下位置
在这里插入图片描述

指针在该行开头,
但是我们要的指针位置是在:
在这里插入图片描述

所以通过获取当前指针 再减去dev103这行字符串的长度 再减去看不见的换行符长度 即:
在这里插入图片描述
这个就是开始写的指针
2.继续读剩下的7行,这时通过 getFilePoint获得当前指针位置 如下图
在这里插入图片描述

指针在这行的开头
3.计算dev103这条数据的长度
在这里插入图片描述
4.覆盖数据
在这里插入图片描述
依次把2后面的数据 从1位置开始写入达到覆盖的作用,最后文件会多出来dev103数据长度的无效数据,
seek(long l)方法是改变当前的指针的位置
第一次seek是读指针,第二次是写指针
在这里插入图片描述

5.删除最后无效的数据,长度为dev103的长度
在这里插入图片描述
这里的break是跳出while循环,因为我这里只删除一条数据,如果删除多条数据可以多次执行该方法.

其他

往文件末尾添加数据(中文)
添加如下2行
在这里插入图片描述
在这里插入图片描述
writeChars()方法是写入字符,但是中文涉及到编码集问题,所以无论如何不要写char类型的数据,可以把char通通改为byte再写入
在这里插入图片描述
换行符同样要转为byte[]
在这里插入图片描述
如果要显示的设置字符集怎么办?
字符编码集和java文件设置的有关,解码集谁解码谁设置,和传输过程中无关
把源码端的中文String转换为byte数组并不会改变字符集,但是char类型会,所以最好别用char来传输带有中文的数据 用byte数组

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值