我有一个在Windows XP下运行的Java程序。它读取文件并关闭文件,或者至少是它应该做的事情。
有时文件仍然处于锁定状态,我无法写入文件(“我”意味着我作为用户,尝试从命令提示符执行copy file2.out file1.out
,其中file1.out
是我的Java文件程序读取)直到我关闭我的Java程序。 (windows抱怨“无法写入带有映射用户进程的文件”或类似内容)
有关如何调试的任何建议?我很难过。
澄清:我遇到的问题不在于 文件是否保持打开状态,或者是哪个进程保持打开状态。问题在于弄清楚在我的Java程序中我没有正确关闭文件,因为它是一个大型程序,并且在InputStream
打开期间,有几个类可以访问文件InputStream
。 / p>
我可以将它缩小到几个班级,但我不确定下一步该在哪里看。
答案 0 :(得分:4)
您可以签出Sysinternals Process Explorer这是一个很好的工具,允许您调试哪个进程持有对文件句柄的锁定。在主菜单中单击Find -> Find Handle or DLL ...
,然后键入文件的名称。它将向您显示持有锁的过程。
就Java程序而言,即使抛出异常(理想情况是在finally
语句中),也要确保始终关闭文件句柄。
答案 1 :(得分:1)
FindBugs非常适合查找这些类型的错误以及其他许多错误。