如何检查Java程序是否保持打开文件的句柄?

时间:2010-12-13 16:28:00

标签: java io

我有一个在Windows XP下运行的Java程序。它读取文件并关闭文件,或者至少是它应该做的事情。

有时文件仍然处于锁定状态,我无法写入文件(“我”意味着我作为用户,尝试从命令提示符执行copy file2.out file1.out,其中file1.out是我的Java文件程序读取)直到我关闭我的Java程序。 (windows抱怨“无法写入带有映射用户进程的文件”或类似内容)

有关如何调试的任何建议?我很难过。


澄清:我遇到的问题不在于 文件是否保持打开状态,或者是哪个进程保持打开状态。问题在于弄清楚在我的Java程序中我没有正确关闭文件,因为它是一个大型程序,并且在InputStream打开期间,有几个类可以访问文件InputStream。 / p>

我可以将它缩小到几个班级,但我不确定下一步该在哪里看。

2 个答案:

答案 0 :(得分:4)

您可以签出Sysinternals Process Explorer这是一个很好的工具,允许您调试哪个进程持有对文件句柄的锁定。在主菜单中单击Find -> Find Handle or DLL ...,然后键入文件的名称。它将向您显示持有锁的过程。

就Java程序而言,即使抛出异常(理想情况是在finally语句中),也要确保始终关闭文件句柄。

答案 1 :(得分:1)

FindBugs非常适合查找这些类型的错误以及其他许多错误。