Windows 10环境下可运行Jar文件无法写入.csv等常见扩展名文件的问题排查与解决
解决Jar运行时写入常见扩展名文件提示“访问被拒绝”的问题
问题回顾
你在Windows 10上用Eclipse开发Java项目,本地通过Eclipse运行主方法时,用FileWriter可以正常写入任意扩展名(甚至无扩展名)的文件;但导出为可运行Jar后,用java -jar命令执行时,只要目标文件是.csv、.txt、.doc这类常见扩展名,就会抛出访问被拒绝的FileNotFoundException,只有无扩展名或.foo这类自定义扩展名的文件能正常写入。
异常栈信息如下:
java.io.FileNotFoundException: csv\report.csv (Access is denied) at java.base/java.io.FileOutputStream.open0(Native Method) at java.base/java.io.FileOutputStream.open(FileOutputStream.java:291) at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:234) at java.base/java.io.FileOutputStream.<init>(FileOutputStream.java:123) at java.base/java.io.FileWriter.<init>(FileWriter.java:66) at project.TestRunner.createCSVFile(TestRunner.java:103)
排查过程与临时缓解
你最初尝试切换Java版本,从64位Java 16:
java version "16.0.2" 2021-07-20 Java(TM) SE Runtime Environment (build 16.0.2+7-67) Java HotSpot(TM) 64-Bit Server VM (build 16.0.2+7-67, mixed mode, sharing)
换成32位Java 8后,问题暂时消失:
java version "1.8.0_301" Java(TM) SE Runtime Environment (build 1.8.0_301-b09) Java HotSpot(TM) Client VM (build 25.301-b09, mixed mode, sharing)
最终根源与解决方案
经过进一步确认,问题的真正原因是过度防护的杀毒软件。很多杀毒软件(包括Windows Defender的严格防护规则)会将Jar程序写入常见文档格式的行为判定为潜在风险,从而拦截文件写入操作;而自定义扩展名或无扩展名的文件不在拦截范围内,所以可以正常写入。
针对这个问题,你可以尝试以下解决方法:
- 检查杀毒软件的实时防护规则,查看是否存在针对Jar文件写入常见格式文件的拦截策略,调整或禁用该规则
- 将你的可运行Jar文件添加到杀毒软件的信任列表/白名单中
- 临时关闭杀毒软件的实时防护进行测试(测试完成后务必重新开启),确认是否是杀毒软件导致的拦截
- 如果是企业级杀毒软件,联系IT管理员调整防护策略,允许该Jar文件的写入操作
内容的提问来源于stack exchange,提问作者Gengar
相关产品推荐
相关产品推荐

