注意兩點:
1. 將資源目錄添加到 build path,確保該目錄下的文件被拷貝到 jar 文件中。
2. jar 內部的東西,可以當作 stream 來讀取,但不應該當作 file 來讀取。
例子
新建一個 maven 目錄
App.java 用於讀取 resources 中的 a.txt 內容。
a.txt 是被讀取的資源文件。
grs@grs App $ tree
.
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ │ └── tony
│ │ │ └── App
│ │ │ └── App.java
│ │ └── resources
│ │ └── a.txt
把資源目錄添加到 build path 中
項目右擊 -> properties -> Java Build Path -> Source -> 把 resources 目錄添加到 build path 中。
如果沒有添加到 build path 中,導出為一個 Runnable JAR 文件后,運行會報錯 Exception in thread "main" java.lang.NullPointerException,解壓 jar 后會發現,a.txt 文件沒有存在於 jar 文件中。
把 resources 加入到 build path ,使得 resources 目錄的文件被包含在 jar 的內部首層路徑中。解壓 jar ,目錄結構如下:
grs@grs app.jar $ tree . ├── META-INF │ └── MANIFEST.MF ├── a.txt └── tony └── App └── App.class
代碼實現
將 resources 目錄設置為 build path 后, a.txt 文件被拷貝到 jar 的首層,所以采用 /a.txt 路徑讀取。采用 stream 方式讀取,確保能讀到打包成 jar 內部資源的文件。
package tony.App; import java.io.IOException; import java.io.InputStream; public class App { public static void main( String[] args ) throws Exception { System.out.println( "Hello World! --- " ); App app = new App(); app.readResources(); } public void readResources() throws IOException{ InputStream is = this.getClass().getResourceAsStream("/a.txt"); System.out.println((char)is.read()); is.close(); } }