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

Java项目重构后无法读取包内txt文件,求支持JAR导出的解决方案

解决方案

核心问题是你用了File类加载资源,但JAR包内的资源不是文件系统中的独立文件,File无法访问JAR内部的资源条目,这也是你用绝对路径能行但打包后失效的原因。正确的做法是用类加载器读取资源流:

1. 修改资源加载代码

把new File(...)换成类加载器的getResourceAsStream,直接读取输入流,代码示例:

public ArrayList<Schnipsel> createList(ArrayList<Schnipsel> pwl, String lvlDateiTxT) throws IOException {
    // 注意路径开头的斜杠:表示从类路径根目录开始查找
    try (InputStream is = getClass().getResourceAsStream("/Assets/Levels/file.txt");
         Scanner input = new Scanner(is)) {
        String passwordString = "";
        int passwordDifficulty;
        while(input.hasNextLine()) {
            passwordString = input.next();
            passwordDifficulty = input.nextInt();
            System.out.println(passwordString + " " + passwordDifficulty);
            pwl.add(new Schnipsel(passwordString, passwordDifficulty));
        }
    }
    return pwl;
}

2. 路径写法说明

  • 如果你的Assets目录是类路径的根目录(比如IDE里标记为Resources Root,或者Maven/Gradle的src/main/resources下),路径用/Assets/Levels/file.txt(开头斜杠不能少,代表根)。
  • 如果你的类所在的包和Assets是同级结构,也可以用相对路径,但推荐用根路径更可靠。

3. 确保资源被打包进JAR

  • 在IDE中,要把Assets目录设置为资源根目录(比如IntelliJ:右键目录 → Mark Directory as → Resources Root)。
  • 如果用构建工具(Maven/Gradle),要确保Assets目录被配置为资源目录,这样打包时会自动把资源复制到JAR的类路径下。

常见坑点

  • 路径大小写:Java资源路径是区分大小写的,确保文件名和路径拼写完全一致(比如File.txt和file.txt是不同的)。
  • 不要用getResource().toString()转成路径再传给File:getResource()返回的URL在JAR里是jar:file:/xxx.jar!/Assets/...这种格式,File无法识别这种路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 17:40:15