You need to enable JavaScript to run this app. Java合并文件后删除旧文件时file1.txt被占用无法删除问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Java合并文件后删除旧文件时file1.txt被占用无法删除问题求助

问题原因
  • 核心问题是读取file1.txt的BufferedReader资源未主动关闭:你在读完file1.txt后直接将br引用重新指向了读取file2.txt的新流,原file1.txt的文件句柄一直处于占用状态,所以删除时会触发「文件被其他进程占用」的异常
  • 原有代码的关闭逻辑只关了最后读取file2.txt的br实例,完全没有处理file1.txt的流资源
修复方案

推荐使用Java 7及以上支持的try-with-resources语法自动管理流资源,无需手动编写关闭逻辑,也不会出现资源遗漏释放的问题,修复后代码如下:

import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.apache.commons.io.IOCase;
import java.io.*;

public static void Filemerger() throws IOException
{
    String resultPath = System.getProperty("java.io.tmpdir");
    File result = new File(resultPath + "//NewFolder", "//file3.txt");

    // 自动管理输出流,代码块结束后自动关闭
    try (PrintWriter pw = new PrintWriter(result)) {
        // 单独处理file1.txt,读取结束后自动关闭流
        try (BufferedReader br = new BufferedReader(new FileReader(resultPath + "file1.txt"))) {
            String line = br.readLine();
            while (line != null) {
                pw.println(line);
                line = br.readLine();
            }
        }
        pw.flush();

        // 单独处理file2.txt,读取结束后自动关闭流
        try (BufferedReader br = new BufferedReader(new FileReader(resultPath + "file2.txt"))) {
            String line = br.readLine();
            while (line != null) {
                pw.println(line);
                line = br.readLine();
            }
        }
        pw.flush();
    }

    // 此时所有源文件流都已释放,可正常删除两个文件
    File dir = new File(resultPath);
    FileFilter fileFilter1 = new WildcardFileFilter(new String[] {"file1.txt", "file2.txt"}, IOCase.SENSITIVE);
    File[] fileList1 = dir.listFiles(fileFilter1);

    for (int i = 0; i < fileList1.length; i++) {
        if (fileList1[i].isFile()) {
            fileList1[i].getAbsoluteFile().delete();
        }
    }
}

如果你不想用try-with-resources语法,也可以在读完file1.txt、给br重新赋值前,手动调用br.close()关闭第一个读取流,也能解决文件占用问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 03:15:04