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

问: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);
    }
}

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

本文参考自 不创建临时文件的情况下如何删除文件前面指定行?

你可能感兴趣的:(Java 如何在不创建临时文件的情况下删除文件前面指定行?)