筆者是個菜鳥,路徑問題在寫項目時經常令我迷惑,所以在此寫下總結。
一、相對路徑
1、在Java中相對路徑,相對的是JVM的啟動路徑,而一般來說就是在項目名稱下啟動的。
在這里我用的Eclipse寫的示例,這是測試項目的目錄
示例代碼:
public class Demo1 { public static void main(String[] args) throws Exception{ File f1 = new File("test1.txt"); File f2 = new File("./test2.txt"); File f3 = new File("src/test3.txt"); File f4 = new File("test4.txt"); System.out.println(f1.exists()+":"+f1.getCanonicalPath()); System.out.println(f2.exists()+":"+f2.getCanonicalPath()); System.out.println(f3.exists()+":"+f3.getCanonicalPath()); System.out.println(f4.exists()+":"+f4.getCanonicalPath()); } }
輸出:
true:D:\spam\path\test1.txt true:D:\spam\path\test2.txt true:D:\spam\path\src\test3.txt false:D:\spam\path\test4.txt
說明:
①從示例中我們可以看到所有的文件都是相對於D:\spam\path這個路徑建立的。
②"./test2"與"test1"表示的都是一樣的語義,相對與當前JVM的啟動目錄
③"../test"表示相對於當前目錄的上一級目錄
④test4告訴我們File的語義表示的僅僅是一個路徑
2、getPath()、getAbsolutePath()、getCanonicalPath()區別
示例:
public class Demo1 { public static void main(String[] args) throws Exception{ File f1 = new File("test1.txt"); File f2 = new File("./test2.txt"); File f3 = new File("src/test3.txt"); System.out.println(f1.exists()+":"+f1.getPath()); System.out.println(f2.exists()+":"+f2.getAbsolutePath()); System.out.println(f2.exists()+":"+f2.getCanonicalPath()); System.out.println(f2.exists()+":"+f2.getPath()); System.out.println(f3.exists()+":"+f3.getCanonicalPath()); } }
輸出:
true:test1.txt true:D:\spam\path\.\test2.txt true:D:\spam\path\test2.txt true:.\test2.txt true:D:\spam\path\src\test3.txt
說明:
①getPath():可以看到得到的就是創建File時的字符串
②getAbsolutePath():得到沒有解析過的絕對路徑
③getCanonicalPath():得到規范的絕對路徑
3、加載文件Class.getResource(String path)
示例:
public class Demo2 { public static void main(String[] args) throws Exception{ Class<?> c = Demo2.class; System.out.println(c.getResource("")); System.out.println(c.getResource("/")); System.out.println(c.getResource("").toURI()); File f1 = new File(c.getResource("/test3.txt").toURI()); System.out.println(f1.exists()+":"+f1.getPath()); } }
輸出:
file:/D:/spam/path/bin/test/ file:/D:/spam/path/bin/ file:/D:/spam/path/bin/test/ true:D:\spam\path\bin\test3.txt
說明:
getResource(String path)方法一般用於加載文件,且是相對於D:/spam/path/bin目錄的,
bin目錄與src目錄基本對應,bin目錄存放.class文件src目錄存放.java文件。
絕對路徑就不說了,很簡單沒啥可說的。
【推薦博客】