JavaWeb中讀取【專案路徑下檔案】的路徑問題:this.getServletContext().getRealPath()
==========
轉自:https://blog.csdn.net/tomcat_2014/article/details/50624120
===========
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應用下的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專案的結構
相關文章
- 【Django】檔案讀取時路徑問題Django
- Java 專案讀取 resource 資原始檔路徑問題Java
- JavaWeb 專案中的絕對路徑和相對路徑以及問題的解決方案JavaWeb
- 讀取web專案properties檔案路徑 解決tomcat伺服器找不到properties路徑問題WebTomcat伺服器
- 檔案路徑問題( ./ 和 ../ 和 @/ )
- django建立的專案路徑問題Django
- Java中的獲取檔案的物理絕對路徑,和讀取檔案Java
- web專案絕對路徑與相對路徑的問題Web
- SpringBoot 中獲取專案的路徑和檔案流Spring Boot
- 遷移Qt專案的路徑問題QT
- 【JavaEE】讀取配置檔案路徑的幾種方式Java
- windows mobile下的檔案路徑Windows
- c#檔案路徑的獲取C#
- js獲取專案根路徑JS
- c# 讀取多個路徑檔案到一個檔案
- java中獲取類載入路徑和專案根路徑的5種方法Java
- [struts]當專案配置為根路徑時發生的action的路徑問題
- vue專案可修改引入檔案的路徑Vue
- 徹底解決java WEB專案的檔案路徑問題(war包)JavaWeb
- help:如何獲取類檔案的路徑
- Python最常用的讀取指定路徑檔案的方法!Python
- 獲取檔案路徑(Delphi )----轉貼
- java獲取專案路徑工具類Java
- Linux檔案的路徑定位-相對路徑和絕對路徑Linux
- 檔案絕對路徑和相對路徑
- Windows程式讀取不了中文路徑問題Windows
- JavaScript中獲取當前專案的絕對路徑JavaScript
- 檔案的相對路徑和絕對路徑以及根相對路徑
- 檔案路徑總結
- SQL Server 檔案路徑SQLServer
- gcc g++ 新增標頭檔案路徑和庫檔案路徑的方法GC
- android下根據路徑不同拷貝檔案至指定路徑Android
- C# 獲取專案程式路徑的方法C#
- 獲取絕對路徑 【檔案找不到】
- jboss 獲取web專案真實路徑Web
- C# Winform中如何獲取檔名與檔案路徑C#ORM
- javaweb中的一些路徑JavaWeb
- 程式設計中對於檔案路徑應該注意的問題程式設計