有没有一种可移植的方法可以找出JVM从VM内部打开了多少文件?

Dav*_*ker 8 java junit unit-testing jvm

我正在编写一些Java文件处理代码的测试,并希望确保所有文件都正确关闭.我不想运行'lsof',因为这将打开更多文件并使测试套件不可移植.有人知道这样做的方法吗?

kdg*_*ory 2

如果您正在寻找 JDK 的一部分,答案是否定的。

您可能会发现一些使用JVMTI的东西,但它是不可移植的(它是本机接口)。或者使用JPDA 的东西,但这需要第二个 JVM。我给你这两个缩写词作为谷歌搜索的开始。

如果您想在 JVM 中运行并可移植,则必须为文件引用引入一个工厂:将所有new FileInputStream()new FileOutputStream()new RandomAccessFile()new FileReadernew FileWriter调用替换为该工厂对象上的方法。该工厂将返回这些对象的子类,这些对象的close()方法被重写。它还将增加“打开文件”计数器,然后通过覆盖的close().

工厂方法和计数器需要是静态和同步的(除非您想注入工厂),并且应该使用系统属性来决定是返回子类流还是 JDK 版本。

就我个人而言,我会采纳评论中的建议,并首先使用 FindBugs。