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

RandomAccessFile类

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

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

原理是:用后面有效的数据覆盖掉要删除的数据,最后让文件从末尾丢弃掉删除数据的长度
RandomAccessFile.setLength(long length) 来设置文件的大小
原来文件
通过RandomAccessFile对文件 删除,修改,新增
通过覆盖数据的方法实现删除功能:覆盖后
通过RandomAccessFile对文件 删除,修改,新增
RandoAccessFile.setLength(long length) 后得到最终文件
通过RandomAccessFile对文件 删除,修改,新增

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

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

有了上面的约束,就可以进行按行遍历,然后进行修改
通过RandomAccessFile对文件 删除,修改,新增

代码实现

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

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

指针在该行开头,
但是我们要的指针位置是在:
通过RandomAccessFile对文件 删除,修改,新增

所以通过获取当前指针 再减去dev103这行字符串的长度 再减去看不见的换行符长度 即:
通过RandomAccessFile对文件 删除,修改,新增
这个就是开始写的指针
2.继续读剩下的7行,这时通过 getFilePoint获得当前指针位置 如下图
通过RandomAccessFile对文件 删除,修改,新增

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

5.删除最后无效的数据,长度为dev103的长度
通过RandomAccessFile对文件 删除,修改,新增
这里的break是跳出while循环,因为我这里只删除一条数据,如果删除多条数据可以多次执行该方法.

其他

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