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
相关产品推荐
相关产品推荐

