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

标签 java unit-testing junit jvm

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

最佳答案

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

您可能会发现使用 JVMTI 的东西,但这不是可移植的(它是 native 界面)。或者使用 JPDA 的东西,但这需要第二个 JVM。我给你这两个首字母缩略词作为谷歌搜索的开始。

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

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

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

关于java - 有没有一种可移植的方法来找出 JVM 从 VM 内部打开了多少文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13144502/

相关文章:

java - 通过命令行运行 Junit 测试

java - 使用 forName 通过 main 检索测试模块中的类

java - 当您同时具有虚拟和真实实现的接口(interface)时,单元测试的最佳方法是什么?

java - 如何修复线程 "main"org.openqa.selenium.WebDriverException 中的异常?

java - 第一次连接到 Glassfish v3 很慢

c# - 如何在测试方法中模拟按键?

python - InvalidBasesError : Cannot resolve bases for [<ModelState: 'users.GroupProxy' >]

JavaFX 包组件

java - 尝试实现 AWS SDK 时出现异常

javascript - 出于单元测试目的访问超出范围的方法