如何讀取項目資源?(加載文件)
阿新 • • 發佈:2018-03-11
wid 路徑 style war type body check servlet absolute 一. getRealPath() getResource() getResourceAsStream() 應該使用哪個???問題:getRealPath()獲得的是絕對路徑,getResource()獲得的是相對路徑,對於開發人員來說都是使用相對路徑
如果你使用的是getRealPath(),把項目壓縮成.war包後部署到遠程服務器後,調用getRealPath會返回null.
為什麽?一個文件被打包.war文件,就不存在目錄結構了。所以,對war包中的資源是無法得到RealPath的。 API描述如下:![技術分享圖片](http://image.bubuko.com/info/201803/20180311020735748732.png)
![技術分享圖片](http://image.bubuko.com/info/201803/20180311020735879583.png)
經過測試:導出war包部署到linux的tomcat服務器上是沒有問題的,因為tomcat會自動解壓. 一般獲取路徑為null的問題都出現在weblogic服務器上,因為Weblogic服務器不會自動解包.war----------------------------------------------------------------------------二.具體API JavaWeb項目對資源文件的讀取:Servlet類和普通java類要點說明:在javaWeb項目中所有src下的資源在部署後都會發布在WEB-INF/classes/下具體說明:在Servlet中:默認從webapp(項目根目錄)下開始查找 localhost:8080/項目名/
來自為知筆記(Wiz)
如果你使用的是getRealPath(),把項目壓縮成.war包後部署到遠程服務器後,調用getRealPath會返回null.
為什麽?一個文件被打包.war文件,就不存在目錄結構了。所以,對war包中的資源是無法得到RealPath的。 API描述如下:
![技術分享圖片](http://image.bubuko.com/info/201803/20180311020735748732.png)
![技術分享圖片](http://image.bubuko.com/info/201803/20180311020735879583.png)
經過測試:導出war包部署到linux的tomcat服務器上是沒有問題的,因為tomcat會自動解壓.
//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");
x1
//ServletContext. getResourceAsStream(String path):
2//(API要求以"/"開頭,測試過加不加"/"都可以)
31.獲取項目webapp目錄下的資源
4 InputStream inputStream1 = context.getResourceAsStream("/make/xlsprint/tOUTPRODUCT.xls");
5 InputStream inputStream2 = context.getResourceAsStream("make/xlsprint/tOUTPRODUCT.xls");
62.獲取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根目錄下獲取
11. 使用Class獲取
2 this.getClass().getResourceAsStream(String path);
3 path 不以‘/‘開頭時默認是從此類所在的包下取資源,以‘/‘開頭則是從ClassPath(Src根目錄)根下獲取。
4 其只是通過path構造一個絕對路徑,底層還是由ClassLoader獲取資源。
5
62. 使用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)
x1
1.servlet類 從webapp開始,"/"開頭
2InputStream inputStream = context.getResourceAsStream(String path);
32.普通java類 從classpath開始,"/"開頭
4InputStream openStream = this.getClass().getClassLoader().getResourceAsStream(String path)
不管是servlet類還是JavaSE類,使用getResource()和getgetResourceAsStream()的路徑寫法都是一樣的;使用效果有一點微小的差別,如下:
------------------------------------------------------------------------
getResourceAsStream()會緩存文件的問題:
getClassLoader().getResourceAsStream會先到緩存中讀取文件,若緩存中沒有,才會到真正的路徑下去讀取文件。在不重啟tomcat的情況下,修改配置文件,用getResourceAsStream方法不會獲取最新的配置文件.
如果需要直接讀取配置文件而不重啟server,需要替換方法:
getClassLoader().getResource("/....").openStream()
不過對於訪問頻繁的情況下,不建議用後者,io開銷影響性能.來自為知筆記(Wiz)
如何讀取項目資源?(加載文件)