Java 如果写入文件时发生错误,如何防止文件擦除?

Java 如果写入文件时发生错误,如何防止文件擦除?,java,android,file,fileoutputstream,Java,Android,File,Fileoutputstream,这是我在许多应用程序中遇到的问题。 我想更改文件中的信息,该文件的版本已过时。 在本例中,在向播放列表添加歌曲后,我正在更新记录播放列表的文件。(作为参考,我正在为android创建一个应用程序。) 问题是如果我运行以下代码: FileOutputStream output = new FileOutputStream(file); output.write(data.getBytes()); output.close(); 如果在尝试写入文件时发生IOException,则数据将丢失(因为创

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

问题是如果我运行以下代码:

FileOutputStream output = new FileOutputStream(file);
output.write(data.getBytes());
output.close();
如果在尝试写入文件时发生IOException,则数据将丢失(因为创建FileOutputStream实例会清空文件)。有没有更好的方法来做到这一点,因此如果发生IOException,旧数据将保持完整?或者这个错误只在文件为只读时发生,所以我只需要检查一下就可以了

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

对不起,如果有人问这个问题。搜索时找不到结果


提前谢谢

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

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

// 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];
}

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