1. 什麼是絕對路徑?什麼是相對路徑?
絕對路徑: 也可稱完整路徑,是指向檔案系統中某個固定位置的路徑,不會因當前的工作目錄而產生變化。為做到這點,它必須包括根目錄。
舉例:
test.txt檔案的絕對路徑為:D:\documents\develop\test.txt
https://www.oracle.com/index.html代表了一個URL絕對路徑
複製程式碼
相對路徑: 則是以指定的工作目錄作為基點,避開提供完整的絕對路徑。檔名稱就可以被視為指定工作目錄為基點的一個相對路徑(雖然一般不將其稱之為路徑)。
Java中載入檔案時使用的相對路徑,究竟是相對於什麼路徑呢?
據java doc上說明,Java使用的相對路徑,就是相對於“當前使用者目錄”,即“Java虛擬機器的呼叫目錄”,更白話就是:我們在哪裡呼叫了JVM的路徑。
舉例:
D盤根目錄下有一java原始檔Test.java,如:D:\Test.java
該Test.java檔案不含package資訊,在命令列視窗編譯此檔案(執行命令:javac Test.java),則會在D盤自動生成Test.class檔案。
然後在命令列視窗執行該程式(執行命令:java Test),此時已啟動一個JVM,這個JVM是在D盤根目錄下被啟動的,則JVM所載入程式中File類的相對路徑就是相對D盤根目錄的,即 D:\
“當前使用者目錄”,即Java虛擬機器的呼叫目錄,也是:D:\
System.getProperty("user.dir")中系統變數"user.dir"存放的也是 D:\
說明:把Test.class移動到不同路徑下,執行java Test命令啟動JVM,發現“當前使用者目錄”是不斷變化的,始終和在哪啟動JVM的路徑是一致的。
複製程式碼
2. 路徑的分類
3. 路徑的區別和操作API
3.1 Java Class的相對路徑
-
相對於classpath的相對路徑
classpath: 就是專案中存放.class檔案的路徑。
舉例: Eclipse專案中classpath為:D:\eclipse32\workspace\java-demo\bin,相對於classpath的相對路徑,就是相對於D:\eclipse32\workspace\java-demo\bin的相對路徑。 (URL形式表示為:file:/D:/eclipse32/workspace/java-demo/bin/) IntelliJ IDEA專案中classpath為:D:\ideaProjectDemo\java-demo\target\classes,相對於classpath的相對路徑,就是相對D:\ideaProjectDemo\java-demo\target\classes的相對路徑。 (URL形式表示為:file:/D:/ideaProjectDemo/java-demo/target/classes/) 複製程式碼
-
相對於當前使用者目錄的相對路徑
當前使用者目錄:即Java虛擬機器的呼叫目錄,即
System.getProperty("user.dir")
返回的路徑。對於一般專案,就是專案的根目錄,例如:java-demo專案的專案根目錄為:D:\ideaProjectDemo\java-demo。
對於JavaEE伺服器,可能是伺服器的某個路徑,這個沒有統一的規範,例如:在Tomcat中執行Web應用,那“當前使用者目錄”是:%Tomcat_Home%/bin(即
System.gerProperty("user.dir")
輸出%Tomcat_Home%/bin),即D:\Program Files\tomcat-5.0.28\bin,由此可以看出Tomcat伺服器是在bin目錄下啟動JVM的(其實是在bin目錄下的“catalina.bat”檔案中啟動JVM的)。說明:
預設情況下,java.io包中的類總是根據“當前使用者目錄”來分析相對路徑名,此目錄由系統屬性user.dir指定,通常是Java虛擬機器的呼叫目錄。
也就是說:在使用java.io包中的類時,最好不要使用相對路徑。(在J2EE程式中會出問題,這個路徑在不同的伺服器中都是不同的)
所以,不要使用相對於“當前使用者目錄”的相對路徑。
3.2 Web應用程式相對路徑
-
伺服器端相對地址
伺服器端的相對地址指的是相對於你的web應用的地址,這個地址是在伺服器端解析的。也就是說在jsp和servlet中的相對地址是相對於你的web應用,即相對於
http://192.168.0.1/webapp/
的。舉例: 1.servlet中: request.getRequestDispatcher("/user/index.jsp"),這個"/user/index.jsp"是相對於當前web應用的webapp目錄的, 其絕對地址就是:http://192.168.0.1/webapp/user/index.jsp 2.jsp中: <%response.sendRedirect("/user/a.jsp");%> 其絕對地址是:http://192.168.0.1/webapp/user/a.jsp 複製程式碼
-
客戶端相對地址
所有的HTML頁面中的相對地址都是相對於伺服器根目錄(
http://192.168.0.1/
)的,而不是相對於伺服器根目錄下Web應用目錄(http://192.168.0.1/webapp/
)的。舉例: HTML中form表單的action屬性的地址是相對於伺服器根目錄(http://192.168.0.1)的, 所以提交到index.jsp為:action="/webapp/user/index.jsp"或action="<%=request.getContextPath()%>/user/a.jsp"; 說明: 一般情況下,在JSP/HTML頁面等引用的CSS,JavaScript.Action等屬性前面最好都加上<%=request.getContextPath()%>,以確保所引用的檔案都屬於Web應用中的目錄。 注意: 應該儘量避免使用".","./","../../"等類似的相對該檔案位置的相對路徑,否則當檔案移動時,很容易出現問題。 "./"代表當前目錄 "../"代表上級目錄 "../../"代表上級目錄的上級目錄 複製程式碼