Java程序中data.txt被锁定,哪个方法导致该问题?
问题诊断与修复方案
首先,问题出在findTextInFile方法里的Scanner资源没有被正确关闭,导致文件句柄被Java进程持续持有,从而阻止了后续的文件重命名操作。
具体原因分析
当你通过main方法调用addScore时,addScore会先调用findTextInFile查找指定字符串的行号:
- 在
findTextInFile中,你创建了Scanner fileInput = new Scanner(data)读取文件,但无论是找到匹配行提前返回,还是循环正常结束后,都没有调用fileInput.close()释放文件资源。 - Windows系统下,文件被进程打开时会添加独占锁,此时其他操作(比如重命名)无法对该文件执行,这就是你收到“文件已在Java(TM) Platform SE binary中打开”提示的核心原因。
- 而单独调用
writeAfterNthLine时,你直接传入了行号,没有触发findTextInFile的执行,所以文件没有被额外的句柄锁定,重命名操作可以正常完成。
修复代码
我们需要确保findTextInFile中的Scanner无论执行路径如何都能被关闭,最稳妥的方式是使用try-with-resources语法(Java 7及以上版本支持),它会自动关闭实现了AutoCloseable接口的资源:
public static int findTextInFile(String s) { try (Scanner fileInput = new Scanner(new File("data.txt"))) { // try-with-resources自动关闭Scanner int ln = 0; while (fileInput.hasNextLine()) { String prevLine = fileInput.nextLine(); ln++; if (prevLine.equals(s)) { return ln; } } } catch (Exception e) { System.out.println(e); } return 0; }
另外,你代码里注释掉的// br.close();属于无效代码,可以直接清理掉,避免混淆。
额外优化建议
- 对于所有文件操作相关的资源(比如Scanner、BufferedReader、PrintWriter等),尽量使用try-with-resources管理,避免手动关闭时遗漏导致的资源泄漏。
- 在
writeAfterNthLine方法中,临时文件路径是硬编码的"C:/Users/jacobw4107/Documents/EZType",换环境运行可能出错,建议改用相对路径或通过系统属性动态获取目录,比如System.getProperty("user.home") + "/Documents/EZType"。
内容的提问来源于stack exchange,提问作者LonelyPyxel
相关产品推荐
相关产品推荐

