如何解决“文件正被另一个进程使用”导致的删除失败问题

发布时间 - 2026-01-20 00:00:00    点击率:

本文详解在java中因文件流未正确关闭而导致`filesystemexception: the process cannot access the file because it is being used by another process`异常的根本原因,并提供基于try-with-resources的安全读写实践,确保json文件可被顺利删除。

在使用Apache POI处理Excel、结合JSON解析生成报表的自动化流程中,一个常见却易被忽视的问题是:成功写入JSON文件后无法删除它。错误提示如 java.nio.file.FileSystemException: ... The process cannot access the file because it is being used by another process,其本质并非系统级进程占用,而是Java自身未释放对文件的句柄(File Handle)——最典型的原因就是 FileReader(或其他输入流)未显式关闭。

回顾原始代码片段:

Object obj = parser.parse(new FileReader(".//Json_files//db-" + stockname + ".json"));

该行直接将 FileReader 作为参数传入 parser.parse(),但 JSONParser.parse() 方法不会自动关闭传入的Reader。这意味着文件流持续处于打开状态,JVM持有操作系统级别的文件锁,导致后续 Files.deleteIfExists() 调用失败。

✅ 正确做法:使用 try-with-resources 语句,确保 FileReader 在解析完成后自动、可靠关闭:

Object obj;
try (FileReader reader = new FileReader(".//Json_files//db-" + stockname + ".json")) {
    obj = parser.parse(reader); // 解析完成后 reader 自动关闭
} catch (IOException | ParseException e) {
    throw new RuntimeException("Failed to parse JSON file: " + stockname, e);
}

⚠️ 同时需注意其他潜在资源泄漏点:

  • PrintWriter out 虽已调用 out.close(),但建议也改用 try-with-resources 更安全;
  • 全局静态流字段(如 public static FileInputStream fi;)极易引发跨测试用例的资源冲突,应避免使用静态流对象,改为方法内局部声明+及时释放;
  • XSSFWorkbook wb 是内存中工作簿,不直接关联文件锁,但若在循环中反复创建未销毁(尤其未调用 wb.close()),可能引发内存溢出或临时文件残留。

? 完整修复建议(关键段落优化):

// ✅ 安全写入 JSON
try (PrintWriter out = new PrintWriter(new FileWriter(".//Json_files//db-" + stockname + ".json", true))) {
    out.write(resp.asString());
} // 自动关闭

// ✅ 安全读取并解析 JSON
Object obj;
try (FileReader reader = new FileReader(".//Json_files//db-" + stockname + ".json")) {
    obj = parser.parse(reader);
} catch (IOException | ParseException e) {
    throw new RuntimeException("JSON parsing failed for " + stockname, e);
}

// ✅ 解析后立即删除(此时文件已无任何流占用)
Path jsonPath = Paths.get(".//Json_files//db-" + stockname + ".json");
if (Files.exists(jsonPath)) {
    Files.delete(jsonPath); // 或 Files.deleteIfExists()
}

? 额外验证技巧:

  • 在删除前添加 System.out.println("Can delete? " + Files.isWritable(jsonPath)); 辅助诊断;
  • Windows 用户可用 Process Explorer 搜索文件名,确认是否仍有 Java 进程持有着该文件句柄。

? 总结:Java 中“文件被占用”的90%以上场景源于开发者未遵循 "open → use → close" 的资源管理铁律。try-with-resources 不仅是语法糖,更是防止资源泄漏、保障文件操作原子性的必备实践。务必对所有 InputStream, OutputStream, Reader, Writer, Connection, Statement 等实现 AutoCloseable 的对象启用该机制。


# excel  # java  # js  # json  # windows  # apache  # 操作系统  # access  # ai  # win  # stream 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 浅谈Javascript中的Label语句  bing浏览器学术搜索入口_bing学术文献检索地址  Python高阶函数应用_函数作为参数说明【指导】  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  Laravel如何创建自定义Facades?(详细步骤)  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  简历在线制作网站免费版,如何创建个人简历?  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  php打包exe后无法访问网络共享_共享权限设置方法【教程】  如何在服务器上配置二级域名建站?  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  如何在阿里云域名上完成建站全流程?  Android okhttputils现在进度显示实例代码  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  如何快速生成橙子建站落地页链接?  如何在万网主机上快速搭建网站?  无锡营销型网站制作公司,无锡网选车牌流程?  制作公司内部网站有哪些,内网如何建网站?  🚀拖拽式CMS建站能否实现高效与个性化并存?  如何构建满足综合性能需求的优质建站方案?  教学论文网站制作软件有哪些,写论文用什么软件 ?  Laravel如何实现事件和监听器?(Event & Listener实战)  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  千库网官网入口推荐 千库网设计创意平台入口  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  想要更高端的建设网站,这些原则一定要坚持!  *服务器网站为何频现安全漏洞?  Bootstrap CSS布局之列表  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  历史网站制作软件,华为如何找回被删除的网站?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  如何在建站之星绑定自定义域名?  如何自定义建站之星网站的导航菜单样式?  制作企业网站建设方案,怎样建设一个公司网站?  如何在 React 中条件性地遍历数组并渲染元素  JS实现鼠标移上去显示图片或微信二维码  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  什么是javascript作用域_全局和局部作用域有什么区别?  西安专业网站制作公司有哪些,陕西省建行官方网站?  如何基于云服务器快速搭建个人网站?  使用Dockerfile构建java web环境