1 问题描述
通过源码运行时,一般使用如下方式读取资源文件:
String str = "1.jpg";
资源文件与源码文件放在同一目录下,或者拥有同一父级目录:
String str = "a/b/1.jpg";
这样直接编译运行没有问题,但是打成 JAR 包后会读取不了,直接抛空指针异常。
2 解决办法
使用 URL
或者 InputStream
进行读取:
URL url = getClass().getClassLoader().getResource("a/b/1.jpg");
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("a/b/1.png");
注意不能在路径前加/
:
URL url = getClass().getClassLoader().getResource("/a/b/1.jpg");
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("/a/b/1.png");
这样读取出来是 null
。getClass().getClassLoader().getResource()
从源码运行的 URL
如下:
从 JAR 包运行的 URL
如下:
测试系统 Win10,从源码运行的话有一个 file:
前缀,而从 JAR 包运行有一个 jar:file:
前缀。
前缀一般没有影响,一般都能直接通过 URL
获取文件,比如在 Swing
的JFrame
中设置图标:
mainFrame.setIconImage(new ImageIcon(getClass().getClassLoader().getResource("image/icon.png")).getImage());
如果只能通过 String
处理路径,需要把前缀 file:
或者 jar:file:
去掉,JAR 的话可以结合 JarFile
类读取文件。