[Java] 在 jar 文件中讀取 resources 目錄下的文件


注意兩點:

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();
    }
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM