Java将字符串写入resources目录文件后文件为空,该如何排查解决?
问题排查及解决方案
1. 核心直接原因
你的代码问题出在没有主动刷新缓冲区、也没有关闭IO流:FileWriter属于带缓冲区的字符输出流,调用write()方法只是把内容写入到内存缓冲区,只有满足以下三个条件之一才会真正把内容写入磁盘:
- 缓冲区被写满
- 主动调用
fw.flush()方法 - 调用
fw.close()关闭流
你的代码写入后没有执行上述任何操作,内容还停留在内存中,所以目标文件为空。
2. 修正后的代码
推荐使用JDK 7及以上支持的try-with-resources语法,会自动关闭流,不需要手动写关闭逻辑:
String json = "string with json"; URL resource = getClass().getClassLoader().getResource("file.json"); // 自动关流,无需手动调用close() try (FileWriter fw = new FileWriter(new File(resource.toURI()))) { fw.write(json); } catch (Exception e) { e.printStackTrace(); }
3. 额外注意事项
- 不要在生产环境往项目
resources目录写入文件:该目录是用来存放静态预置资源的,项目打包成jar/war包后,resources下的文件会被打入包内,没有可写入的实际磁盘路径,强行写入会直接报错。如果需要持久化写入数据,建议指定独立的磁盘目录(比如和jar包同级的config目录、系统临时目录等)。 - 如果是在IDE本地开发环境运行,你读取到的
resource路径实际是编译后输出目录(比如Maven项目的target/classes、Gradle项目的build/classes)下的file.json,不是源码目录src/main/resources下的文件,你去源码目录查看的话自然看不到写入的内容,需要到编译输出目录查看。
内容的提问来源于stack exchange,提问作者Java
相关产品推荐
相关产品推荐

