深入解析Java絕對路徑與相對路徑

讓蛋蛋飛發表於2019-02-21

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的路徑是一致的。
複製程式碼

來自維基百科:zh.wikipedia.org/wiki/路徑_(計算…

2. 路徑的分類

Java Class路徑

Web應用程式路徑

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應用中的目錄。
    注意:
    應該儘量避免使用".","./","../../"等類似的相對該檔案位置的相對路徑,否則當檔案移動時,很容易出現問題。
    "./"代表當前目錄
    "../"代表上級目錄
    "../../"代表上級目錄的上級目錄
    複製程式碼

相關文章