Java getResourceAsStream的使用方法

jopen 9年前發布 | 48K 次閱讀 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");
    }
}



 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!