gpt4 book ai didi

java - 如何诊断 File.delete() 返回错误/查找未关闭的流?

转载 作者:搜寻专家 更新时间:2023-10-30 20:02:42 25 4
gpt4 key购买 nike

我正在使用第 3 方 JPEG/EXIF 操作库 ( Mediautil ),这让我有些头疼。我想更改图像的 EXIF 数据。为此,我需要将更新版本写入临时文件,删除原始文件,然后将临时文件重命名为原始名称。

我的问题是 File.delete() 调用失败并返回 false,大概是因为库仍然以某种方式打开它 - 但我已经完成了所有操作我可以在 API 中找到关闭所有流的方法。更糟糕的是:问题似乎与时间有关,出现问题的单元测试有时会失败,有时不会 - 但代码不是多线程。

奇怪的是,有一个库调用解决了这个问题——但它也删除了我实际上并不想要的 EXIF 缩略图。查看代码,我绝对看不出它在哪里关闭了任何可能保持打开状态的流。

有什么办法可以解决这个问题吗?

编辑:这是在 Windows XP、Java 6 上。还有一件事:我发现如果我在调用 File.delete() 之前调用 System.gc(),它会起作用- 大概是因为这会触发一些终结器。所以它看起来肯定是一个未关闭的流。

最佳答案

我会在这里寻求调试器方面的帮助。快速浏览一下 java.io 内容就会发现,唯一可能的 finalize() 候选对象在 FileOutputStream 中。因此,在其中设置一个断点,运行您的程序,并尝试让 System.gc() 触发 FileOutputStream.finalize() 以释放您的流。这应该可以让您知道这是否是您的问题。

一旦您可以重现它,您就需要开始将 FileOutputStream 实例的实例化与它们的最终化相匹配。一个好的调试器将为您提供每个对象的内部 JVM 对象标识符,因此如果您可以在 OID 创建时跟踪它们,并在它们完成时跟踪它们,那么希望您能够将键调用关联到 通过特定调用 new new FileOutputStream 完成

不过,这可能会很长,具体取决于您的应用程序的复杂程度。

关于java - 如何诊断 File.delete() 返回错误/查找未关闭的流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2128537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com