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

Java更新resource目录下文件后读取仍返回旧内容问题求助

问题原因
  • 路径不匹配,读写的不是同一个文件
    你读取文件时使用的TestHelper.class.getClassLoader().getResourceAsStream("FileA.txt"),默认读取的是编译后类路径(通常是target/classes、build/classes目录)下的资源文件;而写入时使用的new FileOutputStream("FileA.txt",false),相对路径对应的是JVM启动的工作目录(通常是项目根目录),相当于你把修改后的内容写到了项目根目录下的新FileA.txt,完全没有修改到你读取的类路径下的原文件。
  • 类加载器资源缓存
    即使你修正了写入路径,类加载器默认会对已经加载过的资源做缓存,再次调用getResourceAsStream时会直接返回缓存的旧内容,不会重新读取磁盘上更新后的文件。
解决方案
  1. 修正写入路径,保证读写的是同一个文件
    先通过类加载器获取到资源文件的真实磁盘路径,再基于该路径创建输出流写入,示例代码如下:
    URL resourceUrl = TestHelper.class.getClassLoader().getResource("FileA.txt");
    // 注意:如果资源被打包在jar包内,toURI()会抛出异常,jar包内资源是只读不可修改的
    File targetFile = new File(resourceUrl.toURI());
    FileOutputStream fileOut = new FileOutputStream(targetFile, false);
    
  2. 读取时绕开类加载器缓存
    写入完成后直接用文件路径读取最新内容,不要使用类加载器的getResourceAsStream方法,修改readData方法如下:
    public void readData(String myFile) throws IOException, SQLException {
        URL resourceUrl = TestHelper.class.getClassLoader().getResource(myFile);
        File targetFile = new File(resourceUrl.toURI());
        // 直接用文件输入流读取,不走类加载器缓存
        InputStream inputSql = new FileInputStream(targetFile);
        String runSql = new String(inputSql.readAllBytes());
        inputSql.close();
    }
    

注意:如果项目最终是打包成jar包运行,jar包内部的资源文件是只读的,无法直接修改,这种场景请将需要动态修改的配置文件放到jar包外部的目录中读取和修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 06:12:04