【问题标题】:How to prevent file wipe if an error occurs while writing to it?如果在写入文件时发生错误,如何防止文件擦除?
【发布时间】:2020-08-22 05:09:37
【问题描述】:

这是我在许多应用程序中遇到的问题。 我想更改文件中的信息,该文件具有过时的版本。 在这种情况下,我在将歌曲添加到播放列表后更新记录播放列表的文件。 (作为参考,我正在为 android 创建一个应用程序。)

问题是如果我运行这段代码:

FileOutputStream output = new FileOutputStream(file);
output.write(data.getBytes());
output.close();

如果在尝试写入文件时发生 IOException,则数据会丢失(因为创建 FileOutputStream 的实例会清空文件)。有没有更好的方法来做到这一点,所以如果发生 IOException,旧数据保持不变?还是只有当文件是只读的时候才会出现这个错误,所以我只需要检查一下?

我唯一的“解决方法”是通知用户错误,并为用户提供正确的数据,用户必须手动更新这些数据。虽然这可能对开发人员有用,但如果发生这种情况,可能会出现很多问题。此外,在这种情况下,用户没有自己编辑文件的权限,因此“变通”根本不起作用。

抱歉,如果有人问了这个问题。搜索时找不到结果。

提前致谢!

【问题讨论】:

  • 在删除旧文件并重命名新文件之前,您是否尝试过创建一个新文件来保存新信息?
  • @EvanBailey 听起来它可以工作......一个问题,重命名会失败吗?如果没有,如果您发布它,我很乐意接受这个答案!
  • 这些文件是否需要由任何其他应用程序或用户直接使用? (即,除了您自己的代码之外,确切的文件名对其他任何东西都很重要吗?)
  • @EvanBailey 不,该文件只能从应用程序访问(由于 android 对所有文件的严格保密)

标签: java android file fileoutputstream


【解决方案1】:

确保不擦除文件的一种方法是先创建一个具有不同名称的新文件。如果写入该文件成功,您可以删除旧文件并重命名新文件。

重命名可能会失败。为了完全安全,您的文件可以根据创建时间来命名。例如,如果您的文件名为save.dat,您可以将保存文件的时间(从System.currentTimeMillis())添加到文件名的末尾。然后,无论以后发生什么(包括删除旧文件失败或重命名新文件失败),您都可以恢复最近一次成功的保存。我在下面包含了一个示例实现,它将时间表示为附加到文件扩展名的 16 位零填充十六进制数字。名为 save.dat 的文件将被保存为 save.dat00000171ed431353 或类似名称。

// name includes the file extension (i.e. "save.dat").
static File fileToSave(File directory, String name) {
    return new File(directory, name + String.format("%016x", System.currentTimeMillis()));
}

// return the entire array if you need older versions for which deletion failed. This could be useful for attempting to purge any unnecessary older versions for instance.
static File fileToLoad(File directory, String name) {
    File[] files = directory.listFiles((dir, n) -> n.startsWith(name));
    Arrays.sort(files, Comparator.comparingLong((File file) -> Long.parseLong(file.getName().substring(name.length()), 16)).reversed());
    return files[0];
}

【讨论】:

    猜你喜欢
    • 2019-11-13
    • 2013-04-02
    • 2017-11-03
    • 2020-05-26
    • 1970-01-01
    • 2019-09-04
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多