2011-12-29 82 views
1

我正在开发一个将数据写入文件的应用程序。让我们假设它正在写入我们关闭电池的数据。该文件会发生什么?它会被写入一半(损坏),是空的还是与我们写信之前一样?我的猜测是它会被损坏。当文件存储对象的数组列表时,如何检查它是否损坏? java会抛出一个损坏的文件异常,或者说read arraylist为null或者它是一个未知对象?如何在android中备份电池电量数据?

PS。也许创建另一个文件,将保持数据文件的MD5校验和?而且,无论何时我首先写入文件数据,我都会产生校验和,然后当我从数据文件中读取数据时会生成一个校验和,并将其与前一个数据进行比较。这将表明我的数据是否完好无损,但不会让我回滚到之前的状态(预先损坏的状态)。我想要一个尽可能轻量级的方法,我已经通过读取/写入一组数千个属性变化的存储更改来使用CPU。一个数据库可能是一个更好的主意。

回答

3

我不能说Java如何读取损坏的序列化数组,但为了安全起见,我们假设没有错误检测。

在这种情况下,你有两种简单的方式:

  • 存储数据的校验你的数据结构里面,你把它序列化之前。
  • 计算最终序列化文件的校验和。

这两种情况将同样的方式工作,但因为你计算校验你写的事情之前到磁盘(和为此避免额外的一轮文件I/O)的第一选择可能是有点快。

正如你所提到的,MD5会适合这个。 (即使是一个基本的CRC可能会很好 - 你不需要一个cryptograhpic散列这个。)

如果你想允许回滚到以前的版本 - 我只是将每个版本作为一个单独的存储文件,然后有一个指向最近的指针。 (如果您将指针更新为写操作的最后一步,这还将提供额外的保护,防止将损坏的数据输入到您的应用程序 - 尽管您还必须准备将此指针也损坏。由于这基本上是一个提交步骤,因此您可以将损坏的指针解释为“使用最新版本”。)

是的,此时您可能只想使用Android内置的SQLite功能。 :)