我正在为一些 Java 文件处理代码编写测试,并希望确保所有文件都已正确关闭。我不想运行“lsof”,因为这会打开更多文件并使测试套件不可移植。有人知道这样做的方法吗?
最佳答案
如果您正在寻找 JDK 的一部分,答案是否定的。
您可能会发现使用 JVMTI 的东西,但这不是可移植的(它是 native 界面)。或者使用 JPDA 的东西,但这需要第二个 JVM。我给你这两个首字母缩略词作为谷歌搜索的开始。
如果你想在 JVM 中运行并且可移植,你必须为你的文件引用引入一个工厂:替换所有 new FileInputStream()
, new FileOutputStream()
、new RandomAccessFile()
、new FileReader
和 new FileWriter
调用该工厂对象上的方法。该工厂将返回这些对象的子类,它们覆盖了 close()
方法。它还会增加一个“打开的文件”计数器,然后由重写的 close()
减少。
工厂方法和计数器需要是静态的和同步的(除非你想注入(inject)工厂),并且应该使用系统属性来决定是返回子类流还是返回 JDK 版本。
就个人而言,我会采纳评论中的建议,并首先使用 FindBugs。
关于java - 有没有一种可移植的方法来找出 JVM 从 VM 内部打开了多少文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13144502/