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

