Java開發中文件讀取方式總結


JAVA開發中,免不了要讀文件操作,讀取文件,首先就需要獲取文件的路徑。

路徑分為絕對路徑和相對路徑。

在文件系統中,絕對路徑都是以盤符開始的,例如C:\abc\1.txt。
什么是相對路徑呢?相對路徑就是相對與其他文件的路徑。比如說有這么一個文件,它的絕對路徑是C:\abc\def\2.txt,那么它相對與C:\abc\1.txt的路徑就是def\2.txt(也可以寫成這種形式:.\def\2.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:\eclipse\workspace\test\bin\。
如果寫成這樣: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目錄)下,我們還可以通過另兩種方式來讀取。
一、通過字節碼對象來讀
這種方式與上邊Java Project中通過字節碼對象讀取類路徑下文件的方式相同,可參照上邊的4.2。
二、通過類加載器來讀
這種方式與上邊Java Project中通過classloader讀取類路徑下文件的方式基本相同,可參照上邊的4.3。 唯一不同的是:上邊的路徑只能是相對路徑,也就是說不能以“/”開頭。而在JavaWeb Project中,可以是相對路徑,也可以是絕對路徑,也就說你加不加“/”開頭效果是一樣的。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM