1. 程式人生 > >如何讀取項目資源?(加載文件)

如何讀取項目資源?(加載文件)

wid 路徑 style war type body check servlet absolute

一. getRealPath() getResource() getResourceAsStream() 應該使用哪個???問題:getRealPath()獲得的是絕對路徑,getResource()獲得的是相對路徑,對於開發人員來說都是使用相對路徑
如果你使用的是getRealPath(),把項目壓縮成.war包後部署到遠程服務器後,調用getRealPath會返回null.
為什麽?一個文件被打包.war文件,就不存在目錄結構了。所以,對war包中的資源是無法得到RealPath的。 API描述如下:技術分享圖片
技術分享圖片
經過測試:導出war包部署到linux的tomcat服務器上是沒有問題的,因為tomcat會自動解壓.
一般獲取路徑為null的問題都出現在weblogic服務器上,因為Weblogic服務器不會自動解包.war----------------------------------------------------------------------------二.具體API JavaWeb項目對資源文件的讀取:Servlet類和普通java類要點說明:在javaWeb項目中所有src下的資源在部署後都會發布在WEB-INF/classes/下具體說明:在Servlet中:默認從webapp(項目根目錄)下開始查找 localhost:8080/項目名/
//ServletContext. getResourceAsStream(String path):
//(API要求以"/"開頭,測試過加不加"/"都可以)
1.獲取項目webapp目錄下的資源
    InputStream inputStream1 = context.getResourceAsStream("/make/xlsprint/tOUTPRODUCT.xls");
    InputStream inputStream2 = context.getResourceAsStream("make/xlsprint/tOUTPRODUCT.xls");
2.獲取src目錄下的資源
    InputStream inputStream3 = context.getResourceAsStream("/WEB-INF/classes/hello.txt");
x
1
//ServletContext. getResourceAsStream(String path):
2
//(API要求以"/"開頭,測試過加不加"/"都可以)
3
1.獲取項目webapp目錄下的資源
4
    InputStream inputStream1 = context.getResourceAsStream("/make/xlsprint/tOUTPRODUCT.xls");
5
    InputStream inputStream2 = context.getResourceAsStream("make/xlsprint/tOUTPRODUCT.xls");
6
2.獲取src目錄下的資源
7
    InputStream
inputStream3 = context.getResourceAsStream("/WEB-INF/classes/hello.txt");
8
在普通的java類中:"/"代表src根目錄
1. 使用Class獲取
    this.getClass().getResourceAsStream(String path);
    path 不以‘/‘開頭時默認是從此類所在的包下取資源,以‘/‘開頭則是從ClassPath(Src根目錄)根下獲取。
    其只是通過path構造一個絕對路徑,底層還是由ClassLoader獲取資源。

2. 使用ClassLoader獲取
    this.getClass().getClassLoader().getResourceAsStream(String path) :推薦使用
    不管是不是以"/"開頭,都是從ClassPath根目錄下獲取
1
1. 使用Class獲取
2
    this.getClass().getResourceAsStream(String path);
3
    path 不以‘/‘開頭時默認是從此類所在的包下取資源,以‘/‘開頭則是從ClassPath(Src根目錄)根下獲取。
4
    其只是通過path構造一個絕對路徑,底層還是由ClassLoader獲取資源。
5
6
2. 使用ClassLoader獲取
7
    this.getClass().getClassLoader().getResourceAsStream(String path) :推薦使用
8
    不管是不是以"/"開頭,都是從ClassPath根目錄下獲取
9

總結:

1.servlet類 從webapp開始,"/"開頭
InputStream inputStream = context.getResourceAsStream(String path);
2.普通java類  從classpath開始,"/"開頭
InputStream openStream = this.getClass().getClassLoader().getResourceAsStream(String path)
x
1
1.servlet類 從webapp開始,"/"開頭
2
InputStream inputStream = context.getResourceAsStream(String path);
3
2.普通java類  從classpath開始,"/"開頭
4
InputStream openStream = this.getClass().getClassLoader().getResourceAsStream(String path)

不管是servlet類還是JavaSE類,使用getResource()和getgetResourceAsStream()的路徑寫法都是一樣的;使用效果有一點微小的差別,如下:

------------------------------------------------------------------------

getResourceAsStream()會緩存文件的問題:

getClassLoader().getResourceAsStream會先到緩存中讀取文件,若緩存中沒有,才會到真正的路徑下去讀取文件。在不重啟tomcat的情況下,修改配置文件,用getResourceAsStream方法不會獲取最新的配置文件.


如果需要直接讀取配置文件而不重啟server,需要替換方法:

getClassLoader().getResource("/....").openStream()

不過對於訪問頻繁的情況下,不建議用後者,io開銷影響性能.




來自為知筆記(Wiz)

如何讀取項目資源?(加載文件)