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

Java删除文件报错:文件正被其他进程占用,求解决方案

问题分析与解决

核心问题

执行Files.delete(saveFile)时抛出文件占用异常,本质原因是此时saveFile仍被BufferedReader br占用——try-with-resources的资源会在整个try代码块执行完毕后才自动关闭,而你在代码块内部就尝试删除被br打开的文件,自然触发占用异常。

另外代码还有一处隐患:第一个try块中创建tempFile的BufferedWriter未关闭,会导致tempFile被持续占用,后续操作可能出现意外问题。

修复后的代码

Path tempFile = Paths.get("temp.txt");
// 改用try-with-resources确保临时文件流被正确关闭
try (Writer tempWriter = Files.newBufferedWriter(tempFile, StandardOpenOption.CREATE_NEW)) {
    // 仅创建文件,无需额外操作
} catch (IOException e) {
    e.printStackTrace();
}

Path saveFile = Paths.get("save.txt");
Path playerFile = Paths.get(player.username + ".txt");

try (BufferedReader br = Files.newBufferedReader(saveFile)) {
    // 先将文件内容读取到内存,关闭流后再处理文件操作
    List<String> lines = new ArrayList<>();
    String line;
    while ((line = br.readLine()) != null) {
        if (!line.equals(player.username)) {
            lines.add(line);
        }
    }

    // 此时br已自动关闭,saveFile不再被占用,可安全删除
    Files.delete(saveFile);
    Files.delete(playerFile);

    // 将内存中的内容写入新的saveFile,替代原临时文件移动逻辑
    try (Writer fw = Files.newBufferedWriter(saveFile)) {
        for (String l : lines) {
            fw.write(l);
            fw.write(System.lineSeparator());
        }
    }

    // 清理临时文件
    Files.deleteIfExists(tempFile);
} catch (IOException e) {
    e.printStackTrace();
}

关键修复点

  • 分离文件读取与删除操作:先把目标文件内容读到内存,关闭流后再执行删除,彻底避免文件占用。
  • 所有文件流都改用try-with-resources管理,确保资源自动释放,杜绝隐性的文件占用问题。
  • 取消临时文件的写入与移动逻辑,直接将内存中的内容写入新文件,简化流程同时避免临时文件的潜在占用风险。
  • 用System.lineSeparator()替代硬编码换行符,保证代码跨平台兼容性。

内容的提问来源于stack exchange,提问作者nipeng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 18:42:19