通过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数组