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

标签 java io

我正在使用第 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/

相关文章:

java - 搜索算法如何处理 Java 集合(例如 HashSet)中的对象?

python - 读取一个大的 big-endian 二进制文件

Java实现htonl

java - PowerMock - 禁止构造函数但设置私有(private)最终字段

java - 尝试引用 Activity 中 fragment 的按钮

java - 从 BroadcastReceiver 启动 Activity

c++ - 如何将 C++ 类实例(使用 STL 容器)加载/保存到磁盘

c:读取/写入哈希表到文件

java - 为什么我抛出 NullPointerException

Java 性能 : When clearing a object is it better to set to null or create a new object.