經過源碼運行時,通常使用以下方式讀取資源文件:java
String str = "1.jpg";
資源文件與源碼文件放在同一目錄下,或者擁有同一父級目錄:ide
String str = "a/b/1.jpg";
這樣直接編譯運行沒有問題,可是打成JAR包後會讀取不了,直接拋空指針異常。測試
使用URL
或者InputStream
進行讀取:url
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
中設置圖標:code
mainFrame.setIconImage(new ImageIcon(getClass().getClassLoader().getResource("image/icon.png")).getImage());
若是隻能經過String
處理路徑,須要把前綴file:
或者jar:file:
去掉,JAR的話能夠結合JarFile
類讀取文件。blog