Java文件Truncate

本文介绍了如何利用undo日志实现文件错误恢复,通过记录每个数据块的结尾位置,在系统崩溃时使用Java的FileChannel.truncate或RandomAccessFile.setLength方法截断文件,以达到恢复状态。还探讨了检查点频率与写文件效率及错误恢复中数据丢失的平衡问题。
摘要由CSDN通过智能技术生成

文件的恢复其实是一种 undo 日志。将文件的内容分成一个一个块,每一个块可以看成是一个事务,当事务完成时记录检查点。在数据库中,假如一个事务做了一半系统挂掉,可以根据 undo 日志将数据项设置为旧值。类似微信的撤销消息(因为要记录日志,为了减少空间占用,所以微信将其限制在了2分钟,我猜的)。

写文件的 undo 日志很容易实现,记录每个完整小块的结尾位置。一旦出现错误,直接将最新检查点位置后边的不完整数据删掉。java 中一般用 truncate 方法截断文件。

举个例子,每个块由 4 个字节组成,每写完 1 个块,就在另一个文件中记录一个当前文件的最新位置。比如写了5个块,共 20 个字节,检查点记录了五个:4,8,12,16,20。这时候又写了 2 个字节,崩了。

为了继续写文件,需要根据检查点的 20,将文件从 20 处截断。

java nio FileChannel 的 truncate 可以干这个事,RandomAccessFile 和 FileOutputStream 都可以获得当前 FileChannel。

此外,RandomAccessFile 还可以直接用 setLength()。他们都接收一个 long 类型的文件长度,这个位置之后的内容都会被丢弃。

import java.io.*;
import java.nio.file.Path;
import java.nio.file.Paths;

public class CutFile {

    private static final Path path = Paths.get("src", "main", "resources", "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值