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
相关产品推荐
相关产品推荐

