题:不创建临时文件的情况下如何删除文件前面指定行?

阿里云幸运券

问:Java 中不创建临时文件的情况下如何删除文件前面指定行内容呢?

答:这个问题看起来可能会觉得奇怪,也会觉得好像很容易似的,很多人的做法可能会选择使用第三方工具类或者创建 tmp 文件从指定行开始复制写入,完事删除原文件且对 tmp 文件进行重命名。而如果要求不允许创建 tmp 文件如何操作呢?下面给出一个实现方式,其核心就是利用 RandomAccessFile 实现,原理就是把后面内容依次读出来覆盖前面的内容,这样就不用新建文件了。具体代码如下:

private boolean removeFileHeaderLines(File file, int clearHeaderLins)
throws IOException {
RandomAccessFile accessFile = null;
try{
accessFile = new RandomAccessFile(file, “rw”);
long writePosition = accessFile.getFilePointer();
for (int i = 0 ; i < clearHeaderLins; i++){
String line = accessFile.readLine();
if(line == null){
break;
}
}

    long readPosition = accessFile.getFilePointer();

    byte[] buffer = new byte[1024];
    int num;
    while (-1 != (num = accessFile.read(buffer))) {
        accessFile.seek(writePosition);
        accessFile.write(buffer, 0, num);
        readPosition += num;
        writePosition += num;
        accessFile.seek(readPosition);
    }
    accessFile.setLength(writePosition);
    return true;
} catch(Throwable e){
    return false;
} finally{
    IO.closeIO(accessFile);
}

}

这个问题的的应用场景也很多,譬如我们想往一个文件记录一些信息,当文件大小大于指定阈值时就让文件缩小一半(即丢弃前面的记录,保留最近追加的),就可以用上面的工具类实现。

腾讯云代金券

原文链接

https://mp.weixin.qq.com/s?__biz=MzI3ODc3NzQ4NQ%3D%3D&mid=2247484975&idx=1&sn=662d4c5d61b011f622f9c0ecaf590df5&chksm=eb509dcddc2714db3cf59afe847dfb4e9fa2b3f0efb8d6955d24e9b08830a249fceacffd6232&mpshare=1&scene=23&srcid=0907EmawHoii4ECwMOX7u8Z3%23rd

服务推荐

发布了1 篇原创文章 · 获赞 279 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/gt9000/article/details/88599258