Java中File類的構造函數需要我們傳入一個pathname,當我們傳入以"/"開頭的pathname表示絕對路徑,其他均表示相對路徑。
一:絕對路徑名:是完整的路徑名,不需要任何其他信息就可以定位它所表示的文件絕對路徑表示從根目錄定位文件位置,不需要參照其他文件路徑,win中從某個分區磁盤如"e://"開始定位,linux表示從根目錄"/"開始定位。
二:相對路徑:相對路徑名必須使用取自其他路徑名的信息進行解釋。java.io
包中的類總是根據當前用戶目錄來解析相對路徑名。此目錄可以通過System.getProperty("user.dir");獲取。通常是 Java 虛擬機的調用目錄。比如我們有個Test類
public class Test { public static void main(String[] args) { System.out.println(System.getProperty("user.dir")); } }
當我們將Test.class移動到E:\a路徑下執行,輸出為:"E:\a",
我們在Eclipse創建項目FilePathTest(路徑-->E:\WorkSpace\FilePathTest),並創建如上Test類,結構如下:--a.txt
FilePathTest --src --com --Test.java --a.txt --bin --com --Test.class --a.txt
則此時運行Test輸出為"E:\WorkSpace\FilePathTest",也就是相對的目錄為項目目錄。如果此時需要在Test類中獲取項目a.txt文件需要如下使用
File f = new File("bin/a.txt");
三、使用ClassLoader、Class讀取配置文件
jvm通過類加載器加載類,我們可以通過類加載器的加載的目錄作為相對目錄用來讀取文件,類加載器提供了
public URL getResource(String name) public InputStream getResourceAsStream(String name)
通常使用方式為:Test.class.getClassLoader().getResource("");
Class也提供相同的方法,只不過class相對的目錄為"類加載器相對的目錄/類的package";
特別注意:當我們需要將項目打包成jar,此時如果使用getResource()讀取jar中的配置文件,此時返回的URL格式為jar中特有格式file:\E\Test.jar!\a.txt,這種格式作為File()的路徑名是不會被識別的,所以如果我們需要讀取jar中的文件則需要使用getResourceAsStream(""),直接獲取輸入流進行操作。
mmse4j-core-1.9.1.jar中的Dictionary就是因為使用getResource()讀取同一個jar中的字典數據(Dictionary.getDefalutPath())才會找不到文件而報錯,代碼如下:
URL url = Dictionary.class.getClassLoader().getResource("data"); File defalutPath = new File(defPath);