JavaWeb中讀取文件資源的路徑問題

  在作javaweb開發的時候,咱們可能會須要從本地硬盤上讀取某一個文件資源,或者修改某一個文件,這個時候就須要先找到這個文件,而後用FileInputStrem等文件字節。字符流來將這個文件讀取到內存中,再對其進行修改等的操做。那麼在找這個文件的過程當中就涉及到一個路徑的問題--->怎麼正確的找到這個文件呢?java

有兩種可行的方法:1、絕對硬盤路徑;2、相對路徑。。來來來,咱們掰扯一下這兩種方法的不一樣-------web

1、硬盤絕對路徑

  如圖,個人E盤下面有個path文件夾,裏面有一個1.txt的文件,,如今在Servlet中用絕對路徑讀取。tomcat

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,因此---絕對路徑雖然能夠解決問題,可是很不利於維護及項目搬遷。app

那麼,,相對路徑呢??webapp

2、相對路徑

  所謂行對路徑,,指的是相對於整個web應用在硬盤上的路徑來講的,,來來來,咱們演示一下。。。jsp

首先,在個人web應用下的WenRoot下面有一個1.txt文件,,怎麼讀它呢?(注意啊,web應用都是發佈到tomcat的webapps下面執行的ide

 

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

哎哎哎,,等一下,,我要讀的是web應用下得文件啊,,你丫怎麼跑到tomcat/bin下面找了!!!!(個人tomcat/bin下面可沒這個文件,,因此確定讀取不到)code

那麼,爲何會去tomcat/bin下面讀呢?這就得說說Java文件讀取的機制了:若是你直接這樣寫路徑new File("a.***");那麼tomcat就會從程序啓動的地方去找這個文件(Java項目中也是如此),那麼web應用是從有tomcat來執行的,,tomcat這個程序是從哪裏啓動的呢??答對了,就是tomcat/bin/startuo.bat啓動的。

 

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

方法一、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項目的結構

相關文章
相關標籤/搜索