【发布时间】:2010-01-24 19:56:45
【问题描述】:
我正在使用第 3 方 JPEG/EXIF 操作库 (Mediautil),这让我有些头疼。我想更改图像的 EXIF 数据。为此,我需要将更新版本写入临时文件,删除原始文件,然后将临时文件重命名为原始名称。
我的问题是File.delete() 调用失败并返回false,大概是因为库仍然以某种方式打开了它 - 但我已经完成了我在 API 中可以找到的一切以使其关闭所有流。更糟糕的是:问题似乎与时间有关,发生它的单元测试有时会失败,有时不会 - 但代码不是多线程的。
奇怪的是,有一个库调用可以解决问题 - 但它也删除了我实际上并不想要的 EXIF 缩略图。查看代码,我绝对看不出它在哪里关闭了任何可能保持打开状态的流。
任何想法如何解决这个问题?
编辑:
这是在 Windows XP、Java 6 上。还有一件事:我发现如果我在调用 File.delete() 之前调用 System.gc(),它会起作用 - 大概是因为这会触发一些终结器。所以它肯定看起来是一个未封闭的流。
【问题讨论】:
-
您的机器上是否运行了防病毒软件?有时 AV 会在您编写文件后临时打开文件,从而导致您提到有时您在尝试删除时“不走运”的零星行为。
-
@Neil 好主意,但关闭 AV 并没有什么不同。