You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java I/O向resources下TestResult.csv追加内容未写入文件问题

问题产生原因
  • 读写的目标文件不匹配:你手动查看的是src/main/resources下的源文件,但通过ClassLoader读取到的文件路径是项目编译后输出目录(Maven为target/classes、Gradle为build/classes)下的拷贝文件,程序所有写入操作都作用在编译后的拷贝文件上,自然不会同步到src目录下的源文件。第二次运行时读取的是已经被修改过的编译目录下的文件,所以控制台会打印出追加的内容。
  • 缓冲区未及时刷写:FileWriter自带缓冲区,内容写入后不会立刻同步到磁盘,默认只有流关闭时才会自动刷写缓冲区。你在try-with-resources块内写完立刻读,此时内容还停留在缓冲区没有落盘,也会导致读取结果不符合预期。
  • 场景逻辑错误:src/main/resources是静态资源目录,仅用于存放项目运行时需要读取的固定资源,每次项目重新构建时,该目录下的内容都会全量覆盖编译输出目录下的对应文件,哪怕你写入了编译目录下的文件,构建后也会被重置,本身就不适合作为写入操作的目标路径。
解决方案
  • 更换写入目标路径:不要使用resources下的文件作为写入目标,建议选择项目外部的独立目录(比如用户主目录、项目根目录下专门的data目录等)存储需要修改的业务文件,避免被构建流程覆盖,生产环境下类路径资源通常也是只读的,甚至打包成jar后无法直接写入。
  • 调整读写逻辑:将读取操作放到try-with-resources块外,等待FileWriter自动关闭完成缓冲区刷写后再读取;如果需要在块内读取,写完后手动调用fw.flush()强制将缓冲区内容刷入磁盘。

修正后的参考代码如下:

import java.io.*;
import java.nio.file.Files;
import java.io.FileWriter;

public class ReadResourceFileDemo {

    public static void main(String[] args) throws IOException {
        // 实际使用建议替换为自定义的可写目录,例如 System.getProperty("user.home") + "/data/TestResult.csv"
        ClassLoader classLoader = IOLab.class.getClassLoader();
        File file = new File(classLoader.getResource("TestResult.csv").getFile());

        // 写入逻辑单独执行,结束后自动关闭流完成刷写
        try (FileWriter fw = new FileWriter(file, true)) {
            fw.append("\nJulie,Brown,100,A");
        }

        // 流关闭后再读取文件内容
        String content = new String(Files.readAllBytes(file.toPath()));
        System.out.println(content);
    }
}

如果仅用于本地测试,你可以到编译输出的target/classes或者build/classes目录下找到TestResult.csv,即可看到写入的内容。

内容的提问来源于stack exchange,提问作者Tobi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:54:05