专栏首页Apache IoTDB行百里者半九十,文件写90%崩了呢?

行百里者半九十,文件写90%崩了呢?

上篇文章我们介绍了第一个文件格式:

什么是文件格式?

在这里没有对文件有任何的异常处理。假如文件写坏了怎么办?如果一个文件很大,比如你在下片,好几个G,下到一半网断了,是不是很崩溃?这时候就需要断点续传。本文介绍一种文件的断点恢复方法:实现Undo日志。

文件的恢复其实是一种 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 类型的文件长度,这个位置之后的内容都会被丢弃。

那么截断后怎么继续写呢?一种很简单的方式是使用 append 模式开一个 FileOutputStream,继续在文件末尾写数据就好了。

总结

今天介绍了一种文件的错误恢复方式,这种方式依赖一个日志文件,这个日志文件也可以换成一个数据库。记检查点的频率会影响写文件的效率,也会影响错误恢复时丢失的数据量,需要自己平衡。

之前我们有讨论过 RandomAccessFile 可以直接定位到文件的某个位置写新的数据,看起来也可以进行断点恢复,但是需要保证新写的数据比需要截断的数据长。

代码:

https://github.com/qiaojialin/Java-IO-Learning

本文分享自微信公众号 - IoTDB漫游指南(Apache-IoTDB),作者:乔老师

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-06-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Apache IoTDB 发布 0.9.3!

    很久没有写文章了,一直在搞开发,趁着这次版本发布来写一篇。0.9.3 是一个小版本,没有动文件结构和 rpc,可以无痛升级。其实之前新发布了一个0.9.2,不过...

    Apache IoTDB
  • Apache IoTDB 系列教程-4:客户端接口

    现在的客户端和服务器通信采用了跨语言的 RPC 框架 Thirft,理论上 Thrift 能生成的语言都能支持。但是直接用 Thrift 生成的代码对数据库使用...

    Apache IoTDB
  • java 字节流入门(读文件)

    从磁盘到内存的流程大体介绍完了,本文主要介绍读文件中的坑,在实际系统中,如果不注意这些小坑,有可能导致系统挂掉。

    Apache IoTDB
  • 80-综合练习:记账小程序

    凯茜的老爸
  • OpenCV实战 | Hessian矩阵以及在血管增强中的应用

    - 由于本文代码基于OpenCV基础库,所以题目中添加了“OpenCV实现”字样。

    OpenCV学堂
  • DotNet处理服务器路径的方法

        项目中需要使用到路径处理的地方比较多,对于路径的解析和匹配有时较为繁琐,现在提供一个对路径进行解析的方法:  1.验证设置路径字符串: ...

    彭泽0902
  • Android系统启动之zyogte进程java(下)

    ZygoteServer的代码路径frameworks/base/core/java/com/android/internal/os/ZygoteServer....

    李小白是一只喵
  • Python基于当前时间批量创建文件

    在平时的工作中,我们经常会遇到需要批量创建文件的情况,例如,汇总一个月中每天回复问题的文件等,这里,我们以如何使用当前日期时间创建文件为例:

    砸漏
  • 现代 C++:自动类型推导

    现代的编程语言,不管是动态语言(JavaScript、Python 等),还是静态语言(Go、Rust 等),大都支持自动类型推导(type deduction...

    linjinhe
  • OpenvSwitch系列之浅析main函数

    通过前面几篇解析OpenvSwitch内部主要数据结构和流程,对OpenvSwitch有了相对简单的了解,由于本人不是专业搞OpenvSwitch的,纯属业余爱...

    SDNLAB

扫码关注云+社区

领取腾讯云代金券