You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:24:03