JavaWeb中讀取【專案路徑下檔案】的路徑問題:this.getServletContext().getRealPath()

小夥子加油發表於2018-04-09

==========

轉自:https://blog.csdn.net/tomcat_2014/article/details/50624120

===========

JavaWeb中讀取檔案資源的路徑問題

轉載 2016年02月02日 15:34:49
  • 16757

在做javaweb開發的時候,我們可能會需要從本地硬碟上讀取某一個檔案資源,或者修改某一個檔案,這個時候就需要先找到這個檔案,然後用FileInputStrem等檔案位元組。字元流來將這個檔案讀取到記憶體中,再對其進行修改等的操作。那麼在找這個檔案的過程中就涉及到一個路徑的問題--->怎麼正確的找到這個檔案呢?

有兩種可行的方法:一、絕對硬碟路徑;二、相對路徑。。來來來,我們掰扯一下這兩種方法的不同-------

一、硬碟絕對路徑

  如圖,我的E盤下面有個path資料夾,裡面有一個1.txt的檔案,,現在在Servlet中用絕對路徑讀取。

技術分享

技術分享
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
    String path = "E:\\path\\1.txt";
    File file = new File(path);
    System.out.println(file.getAbsolutePath());//輸出讀取到的檔案路徑
}
View Code

 

 訪問這個servlet,結果讀取正常

技術分享

但是呢,這樣寫真的好嗎???我們知道,一個web應用可能會存在一個更換伺服器的情況,,,如果是一個上線的專案,一旦伺服器換了,那麼新換的伺服器會存在E:\path\1.txt這個檔案路徑嗎???答案:NO,所以---絕對路徑雖然可以解決問題,但是很不利於維護及專案搬遷。

那麼,,相對路徑呢??

二、相對路徑

  所謂行對路徑,,指的是相對於整個web應用在硬碟上的路徑來說的,,來來來,我們演示一下。。。

首先,在我的web應用下的WebRoot下面有一個1.txt檔案,,怎麼讀它呢?(注意啊,web應用都是釋出到tomcat的webapps下面執行的

技術分享

 

可能我們會在servlet中這樣寫路徑來讀取:

技術分享

哎哎哎,,等一下,,我要讀的是web應用下得檔案啊,,你丫怎麼跑到tomcat/bin下面找了!!!!(我的tomcat/bin下面可沒這個檔案,,所以肯定讀取不到)

那麼,為什麼會去tomcat/bin下面讀呢?這就得說說Java檔案讀取的機制了:如果你直接這樣寫路徑new File("a.***");那麼tomcat就會從程式啟動的地方去找這個檔案(Java專案中也是如此),那麼web應用是從有tomcat來執行的,,tomcat這個程式是從哪裡啟動的呢??答對了,就是tomcat/bin/startup.bat啟動的。技術分享

 

so。。這樣寫肯定找不到的,,,那麼怎麼找??

方法1、servlet中用ServlertContext域的getRealPath()這個方法找

簡單程式碼如下:

技術分享

哎,這才對嘛,,我的專案是釋出到tomcat的webapps資料夾下的,,這樣才對嘛。。。所以是怎麼一個原理呢?

對於ServletContext().getRealPath("路徑名A");這個方法,無論你的路徑名A是什麼,ServletContext().getRealPath()方法底層都會在路徑名A前拼上當前web應用的硬碟路徑,,這樣加上你傳進去的路徑就可以找成功找到了

技術分享

小結一下:其實通過ServletContext().getRealPath來拼接路徑只是絕對硬碟路徑的升級版,,,但是它好久好在計時你的web應用換了伺服器環境,只要你的檔案在web應用的中的相對路徑不變,那麼不論你的web應用如何更換伺服器環境,都能動態的獲取當前伺服器環境的絕對檔案路徑。

當然,上面的getRealPath()方法只能在servlet中使用(因為只有servlet才有ServletContext域物件),在MVC模式中,很多時候servlet並不是來做處理請求的,跟多的是進行一個轉發操作,那麼,如果是在servlet中呼叫普通的Java類來讀取檔案呢???怎麼讀檔案?

如果只是普通的java類,那麼你也可以直接使用絕對硬碟路徑,,但同樣,伺服器環境換了之後就可能會掛掉。可以通過類載入器ClassLoader類的getResource()方法來載入檔案。。原理是:

類載入器是從你的web應用的WEB-INF\class資料夾下找.class檔案來載入的。所以呢,你要找的web應用中的檔案只要相對於你的class資料夾找就可以了。

技術分享

來,我們try一try。。。新建一個普通的Java類PathofJava.java,

技術分享

servlet中呼叫這個類的method()方法,訪問一下這個servlet---

技術分享

所以正確的方法是用類載入器去找:

技術分享

為什麼要用../../1.txt呢?因為1.txt做i中釋出到tomcat中web應用下去了,跟index.jsp平級,所以用../(表示上級目錄)來找

技術分享

小結一下:其實類載入器也是搞出來一個絕對硬碟路徑來找檔案的,只是這個絕對路徑是隨著web應用的路徑變化而變化的,就不存在web應用換了伺服器環境找不到資源的問題了

附上整個test專案的結構

技術分享


相關文章