java project 和 javaWeb的讀取檔案路徑問題(整理自百度經驗,有空驗證下)
總結:
1. 從工程根目錄開始的路徑直接讀取
File f = new File(“1.txt”),或者寫成這樣:File f = new File(“./1.txt”);
./,表示工程根目錄,可以省略!
這裡不要使用File f = new File(“../1.txt”);
2. 通過位元組碼物件讀取(避免)
在Hello.java中:String f = Hello.class.getResource(“/4.txt”).getPath();
這種以“/”開頭的是以絕對路徑方式讀取,意思是從bin目錄下開始讀取4.txt。
如果寫成這樣:String f = Hello.class.getResource
這種不以“/”開頭的是以相對路徑方式讀取,意思是從當前類所在的目錄下開始讀取4.txt。
3. 通過classloader讀的話,它只會從classpath下開始讀取(不是class位置),並且java project不能以“/”開頭,javaWeb以不以“/”開頭路徑相同。
3.1、當前類名.class.getResource()的返回值型別是URL;同時還有一個方法:當前類名.class.getResourceAsStream(),它的返回值型別是InputStream,是一個位元組讀取流。在開發中可以根據需要選擇相應的方法。
3.2、要讀取檔案,檔案首先必須真實存在
4. 專案最終要部署在web伺服器中,檔案只能使用絕對路徑來讀取
getServletConfig().getServletContext().getRealPath(“/WEB-INF/2.txt”);這種方式只是獲取檔案的路徑字串,並不會檢查是否真的存在這樣一個檔案。“/WEB-INF/2.txt”換成“WEB-INF/2.txt”,路徑是一樣的。
通過ServletContext物件可以獲取web工程根目錄及其子目錄(包括WEB-INF、classes等)所有檔案的絕對路徑。
4.1如果檔案位於classpath(也就是classes目錄)下,我們還可以通過另兩種方式來讀取。
1、通過位元組碼物件來讀
這種方式與上邊Java Project中通過位元組碼物件讀取類路徑下檔案的方式相同,可參照上邊的2。
2、通過類載入器來讀
這種方式與上邊Java Project中通過classloader讀取類路徑下檔案的方式基本相同,可參照上邊的3。
唯一不同的是: Java Project中通過classloader讀的話,它只會從classpath下開始讀取,並且不能以“/”開頭。而在JavaWeb Project中,可以是相對路徑,也可以是絕對路徑,也就說你加不加“/”開頭效果是一樣的。
===Java Project和JavaWeb Project,通過classloader讀的話,都不要加“/”開頭就不會有問題了。