Java getResourceAsStream的使用方法
在java項目中會經常用到getResourceAsStream這個函數獲取一些配置文件,但是怎樣正確使用這個函數呢?
getResourceAsStream(String path)這個函數的參數是一個路徑,但是這個路徑應該怎么填?使用該函數的難點也就在此。
其實只要記住一個關鍵點,getResourceAsStream這個函數尋找文件的起點是JAVA項目編譯之后的根目錄,比如一般maven項目編譯之后根目錄都是target/classes這個文件,舉個例子,比如下面這個目錄樹就是一個maven項目編譯之后的文件分布情況:
.
├── auth.server.properties
├── com
│ ├── winwill
│ │ └── test
│ │ ├── TestConstants.class
│ │ ├── TestConstants$HOST.class
│ │ ├── TestGetResourceAsStream.class
│ │ └── TestGuava.class
│ └── xiaomi
│ └── xmpush
│ └── ios
│ ├── IOSPushTest.class
│ ├── UploadCertificate$1.class
│ └── UploadCertificate.class
├── config
│ └── config2.properties
├── config.properties
├── kafka-consumer.properties
├── kafka-producer.properties
├── META-INF
│ ├── MANIFEST.MF
│ └── maven
│ └── com.winwill.test
│ └── test
│ ├── pom.properties
│ └── pom.xml
├── redis.properties
└── zookeeper.properties
我們在TestGetResourceAsStream.class這個類中應該怎么獲取config.properties和config2.properties這兩個文件呢?
使用getClass().getResourceAsStream()
從上面的目錄樹可以看到,config這個文件的路徑是/config.properties(/表示根目錄),config2.properties這個文件的路徑是/config/config2.properties,所以我們可以使用下面的代碼獲取這兩個文件:
package com.winwill.test; import org.junit.Test; import java.io.IOException; import java.io.InputStream; /** * Created by qifuguang on 14-9-28. */ public class TestGetResourceAsStream { @Test public void getResourceClassAndFileInSamePackage() throws IOException { // 獲取config2.properties InputStream config2 = this.getClass().getResourceAsStream("/config/config2.properties"); // 獲取config.properties InputStream config = this.getClass().getResourceAsStream("/config.properties"); } }
上面的代碼使用的是從根目錄開始的絕對路徑,那么可不可以使用相對路徑呢?當然可以,請看下面的代碼:
package com.winwill.test; import org.junit.Test; import java.io.IOException; import java.io.InputStream; /** * Created by qifuguang on 14-9-28. */ public class TestGetResourceAsStream { @Test public void getResourceClassAndFileInSamePackage() throws IOException { // 獲取config2.properties InputStream config2 = this.getClass().getResourceAsStream("../../../config/config2.properties"); // 獲取config.properties InputStream config = this.getClass().getResourceAsStream("../../../config.properties"); System.out.println(config + " " + config2); } }
代碼中的兩個路徑就是這兩個文件相對TestGetResourceAsStream.class這個文件的的相對路徑。
使用getClass().getClassLoader().getResourceAsStream()
getClass().getClassLoader().getResourceAsStream()默認使用的路徑就是class文件的根目錄,所以使用getClass().getClassLoader().getResourceAsStream()來獲取文件的時候不能在路徑前面加上/,于是我們可以這樣獲取這兩個文件:
package com.winwill.test; import org.junit.Test; import java.io.IOException; import java.io.InputStream; /** * Created by qifuguang on 14-9-28. */ public class TestGetResourceAsStream { @Test public void getResourceClassAndFileInSamePackage() throws IOException { // 獲取config2.properties InputStream config2 = this.getClass().getClassLoader().getResourceAsStream("config/config2.properties"); // 獲取config.properties InputStream config = this.getClass().getClassLoader().getResourceAsStream("config.properties"); } }