JavaWeb中讀取文件資源的路徑問題
在做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());//輸出讀取到的文件路徑 }
訪問這個servlet,結果讀取正常

但是呢,這樣寫真的好嗎???我們知道,一個web應用可能會存在一個更換服務器的情況,,,如果是一個上線的項目,一旦服務器換了,那么新換的服務器會存在E:\path\1.txt這個文件路徑嗎???答案:NO,所以---絕對路徑雖然可以解決問題,但是很不利于維護及項目搬遷。
那么,,相對路徑呢??
二、相對路徑
所謂行對路徑,,指的是相對于整個web應用在硬盤上的路徑來說的,,來來來,我們演示一下。。。
首先,在我的web應用下的WenRoot下面有一個1.txt文件,,怎么讀它呢?(注意啊,web應用都是發布到tomcat的webapps下面執行的)

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

哎哎哎,,等一下,,我要讀的是web應用下得文件啊,,你丫怎么跑到tomcat/bin下面找了!!!!(我的tomcat/bin下面可沒這個文件,,所以肯定讀取不到)
那么,為什么會去tomcat/bin下面讀呢?這就得說說Java文件讀取的機制了:如果你直接這樣寫路徑new File("a.***");那么tomcat就會從程序啟動的地方去找這個文件(Java項目中也是如此),那么web應用是從有tomcat來執行的,,tomcat這個程序是從哪里啟動的呢??答對了,就是tomcat/bin/startuo.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項目的結構

浙公網安備 33010602011771號