【问题标题】:File.createTempFile create special file or how to force flush data to harddrive?File.createTempFile 创建特殊文件或如何强制刷新数据到硬盘?
【发布时间】:2010-08-26 17:27:49
【问题描述】:

我正在使用 File.createTempFile 创建我想要保留的常规文件,我使用此方法的原因是因为它保证了唯一的文件名。但是我看到这种方法创建的文件有一个奇怪的事情:在我刷新并关闭此文件上的输出流后,我故意使运行 JVM 的机器崩溃,我假设由于流被刷新和关闭,文件应该包含有效数据。但是,有时文件会被 0x0 填充(注意,我在运行 WinXP 和最新 Sun JVM 1.6 的 VMWare 机器上对此进行测试)。

问题是由临时文件引起的,还是适用于所有 Java 文件 io 的某种普遍问题?我应该怎么做才能确保数据被刷新到硬盘?

谢谢

【问题讨论】:

  • 先向我们展示你的 I/O 代码,然后我们可以将其归咎于 Java。
  • 我使用的是旧式 io: File file = File.createTempFile(FILE_PREFIX, FILE_SUFFIX, myDirectory); FileOutputStream fout = new FileOutputStream(file); ObjectOutputStream out = new ObjectOutputStream(fout); out.writeObject(obj); out.flush(); out.close();

标签: java file-io filestream temporary-files


【解决方案1】:

除了flush(),请尝试在您的FileOutputStream 上拨打output.getFileDescriptor().sync()

【讨论】:

  • 这似乎是理想的方法,不幸的是,它不起作用。如果我在崩溃前再等一段时间,我可以看到日志(日志文件和数据文件有同样的问题,所以如果我立即崩溃,日志也会丢失,无法知道发生了什么),它显示每次我调用同步方法时都会失败并出现 SyncFailedException(在 for 循环中尝试了 5 次)。所以我怀疑底层操作系统不支持这个。 (注意:当我看到日志时,即使同步失败,数据仍然可以成功写入,但是如果我在流关闭(1-2s)后很快崩溃机器,它仍然会失败。
  • 对不起,我的测试代码出错了,sync() 是正确的使用方法,谢谢!
【解决方案2】:

大多数现代文件系统访问都会遇到此类问题 - 请参阅 about filesystem journaling 以快速了解该问题。

简而言之 - 如果您的系统崩溃,最近更新的文件可能会恢复为以前的数据。如果您最近创建了该文件,它可能是零填充的。

在 UNIX 上,您可以使用 fsync 和/或 fdatasync 来防止这种情况。我不是 Windows 人,但这可能是一个起点:cross platform fsync()。我不知道如何从 Java 中做到这一点。

【讨论】:

  • 他声称他在 VM 崩溃之前正确关闭了文件。我怀疑写入此文件的 I/O 代码有问题。
  • 其他一些 SO 问题表明关闭是不够的。这是一个……stackoverflow.com/questions/730521/…
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 2021-05-24
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多