如何解决“文件正被另一个进程使用”导致的删除失败问题
发布时间 - 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环境

