Java开发中文件读取方式总结
JAVA開發中,免不了要讀文件操作,讀取文件,首先就需要獲取文件的路徑。路徑分為絕對路徑和相對路徑。
在文件系統中,絕對路徑都是以盤符開始的,例如C:abc1.txt。
什么是相對路徑呢?相對路徑就是相對與其他文件的路徑。比如說有這么一個文件,它的絕對路徑是C:abcdef2.txt,那么它相對與?C:abc1.txt的路徑就是def2.txt(也可以寫成這種形式:.def2.txt)。”.”的意思是當前目錄,也就是它所相對的文件所在的目錄,在這里就是:C:abc。
在Java開發中,我們通常會創建兩種工程:Java?Project和JavaWeb?Project。
一、在Java?Project中,我們用的是相對路徑。比如我們這里有一個Java工程:test,在test下邊會自動創建兩個目錄:src和bin。
1、這時候我們如果在test下新建一個文件:1.txt?,那么我們在代碼當中就可以這樣讀取它:File?f?=?new?File(“1.txt”),或者寫成這樣:File?f?=?new?File(“./1.txt”);
2、如果test下新建目錄abc?,在abc?下新建文件2.txt,代碼讀取就是這樣:File?f?=?new?File(“abc/2.txt”),或者寫成這樣:File?f?=?new?File(“./abc/2.txt”);
3、如果在src下新建文件3.txt,代碼讀取就是這樣:File?f?=?new?File(“src/3.txt”),或者寫成這樣:File?f?=?new?File(“./src/3.txt”);由于src下的所有文件最終會被編譯到bin目錄下,所以直接讀取src下的文件沒有多大意義。
4、如果在src下有一個文件4.txt,我們知道它最終被編譯到bin目錄下,那么怎么去讀取這個編譯后的文件呢?有3種方式來讀取。
4.1、直接讀取
File?f?=?new?File(“bin/4.txt”),或者寫成這樣:File?f?=?new?File(“./bin/4.txt”);
由于bin目錄(包括web應用中WEB-INF下的classes目錄)統稱為classpath(類路徑),對于類路徑下的文件,我們還可以采用下邊兩種方式來讀取。
4.2、通過字節碼對象讀取
假如當前類為:Hello.java,它所在的包是:com.mac.util
在Hello.java中:String?f?=?Hello.class.getResource(“/4.txt”).getPath();這種以“/”開頭的是以絕對路徑方式讀取,意思是從bin目錄下開始讀取4.txt,/=D:eclipseworkspacetestbin。
如果寫成這樣:String?f?=?Hello.class.getResource(“4.txt”).getPath();這種不以“/”開頭的是以相對路徑方式讀取,意思是從當前類所在的目錄下開始讀取4.txt,顯然是讀不到的,改成這樣就可以了:String?f?=?Hello.class.getResource(“../../../4.txt”).getPath();“..”代表當前目錄的上一級目錄,由于當前類所在的包是三層,所以這里使用了三次“..”。
同理:如果4.txt位于com.mac.util包下,與Hello.class處于同一目錄。用絕對路徑讀就是這樣:String?f?=?Hello.class.getResource(“/com/mac/util/4.txt”).getPath();用相對路徑讀就是這樣:String?f?=?Hello.class.getResource(“4.txt”).getPath();注意:相對路徑這種讀取方式僅限于在?和被讀取文件位于同一包下的類中可以這么讀,其他包中的類是不能這樣讀取的。
綜上所述:采用相對路徑讀取文件還要考慮當前類所在的位置,非常麻煩,所以對于classpath下的文件,我們統一采用絕對路徑方式來讀取。
4.3、通過類加載器讀取
String?f?=?當前類名.class.getClassLoader().getResource(“4.txt”).getPath();
注意:通過類加載器讀取只能使用相對路徑,如果使用絕對路徑就讀取不到了,比如改成這樣:String?f?=?當前類名.class.getClassLoader().getResource(“/4.txt”).getPath();就不行。
如果把4.txt放到com.mac.util包下,讀取代碼:String?f?=?當前類名.class.getClassLoader().getResource(“com/mac/util/4.txt”).getPath();
可以看出,通過classloader讀的話,它只會從classpath下開始讀取,并且不能以“/”開頭。
特別的是:1、當前類名.class.getResource()的返回值類型是URL;同時還有一個方法:當前類名.class.getResourceAsStream(),它的返回值類型是InputStream,是一個字節讀取流。在開發中可以根據需要選擇相應的方法。
2、要讀取文件,文件首先必須真實存在,要不然返回的URL就等于Null。
二、在JavaWeb?Project中,使用相對路徑是讀不到文件的,因為JavaWeb?Project與Java?Project不同,項目最終要部署在web服務器中,文件只能使用絕對路徑來讀取。
比如我使用的IDE是eclipse,建立一個web?project:day01,在WebContent(工程根目錄)下有一個文件1.txt,那么就可以通過ServletContext對象來讀取了。
比如在servlet中,可以這樣:getServletConfig().getServletContext().getRealPath(“/1.txt”);這種方式只是獲取文件的路徑字符串,并不會檢查是否真的存在這樣一個文件。
比如我把1.txt刪除,執行上邊代碼仍然可以打出路徑:...../apache-tomcat-7.0.42/webapps/day01?/1.txt。并且這里的路徑可以是絕對路徑也可以是相對路徑,取得的效果是一樣的。比如寫成這樣也是可以的:getServletConfig().getServletContext().getRealPath(“1.txt”);
如果在WEB-INF下有一個文件2.txt,讀取:getServletConfig().getServletContext().getRealPath(“/WEB-INF/2.txt”);也就是說通過ServletContext對象可以獲取web工程根目錄及其子目錄(包括WEB-INF、classes等)所有文件的絕對路徑。
當然,如果文件位于classpath(也就是classes目錄)下,我們還可以通過另兩種方式來讀取。
1、通過字節碼對象來讀
這種方式與上邊Java?Project中通過字節碼對象讀取類路徑下文件的方式相同,可參照上邊的4.2。
2、通過類加載器來讀
這種方式與上邊Java?Project中通過classloader讀取類路徑下文件的方式基本相同,可參照上邊的4.3。?唯一不同的是:上邊的路徑只能是相對路徑,也就是說不能以“/”開頭。而在JavaWeb?Project中,可以是相對路徑,也可以是絕對路徑,也就說你加不加“/”開頭效果是一樣的。
?
轉載于:https://blog.51cto.com/yuke198907/1340760
總結
以上是生活随笔為你收集整理的Java开发中文件读取方式总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tomcat开启SSL8443端口的方法
- 下一篇: Windows Azure 数据安全(清