java 絕對路徑 / 相對路徑總結

來源:互聯網
上載者:User

標籤:命令   文章   tor   dir   contex   程式   puts   use   space   

注意:相對於目前使用者目錄的相對路徑
  就是相對於System.getProperty("user.dir")返回的路徑。
  對於一般項目,這是項目的根路徑。對於JavaEE伺服器,這可能是伺服器的某個路徑。這個並沒有統一的規範!
  所以,絕對不要使用"相對於目前使用者目錄的相對路徑"。然而:
  預設情況下,java.io 包中的類總是根據目前使用者目錄來分析相對路徑名。此目錄由系統屬性 user.dir 指定,通常是 JAVA 虛擬機器的調用目錄。
  這就是說,在使用java.io包中的類時,最好不要使用相對路徑。否則,雖然在J2SE應用程式中可能還算正常,但是到了J2EE程式中,一定會出問題!而且這個路徑,在不同的伺服器中都是不同的!

一,  相對路徑最佳實務
  推薦使用相對於當前classpath的相對路徑
  因此,我們在使用相對路徑時,應當使用相對於當前classpath的相對路徑。
  ClassLoader類的getResource(String name),getResourceAsStream(String name)等方法,使用相對於當前項目的classpath的相對路徑來尋找資源。
  讀取屬性檔案常用到的ResourceBundle類的getBundle(String path)也是如此。

  下面是一些得到classpath和當前類的絕對路徑的一些方法。你可能需要使用其中的一些方法來得到你需要的資源的絕對路徑。

  1.FileTest.class.getResource("")
  得到的是當前類FileTest.class檔案的URI目錄。不包括自己!

  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/com/test/

  2.FileTest.class.getResource("/")
  得到的是當前的classpath的絕對URI路徑。

  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

  3.Thread.currentThread().getContextClassLoader().getResource("")
  得到的也是當前ClassPath的絕對URI路徑。

  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

  4.FileTest.class.getClassLoader().getResource("")
  得到的也是當前ClassPath的絕對URI路徑。

  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

  5.ClassLoader.getSystemResource("")
  得到的也是當前ClassPath的絕對URI路徑。

  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/

  我推薦使用Thread.currentThread().getContextClassLoader().getResource("")來得到當前的classpath的絕對路徑的URI標記法。

 

二 ,1.servlet中讀寫。如果運用Struts 或者Servlet可以直接在初始化參數中配置,調用時根據servlet的getRealPath("/")擷取真實路徑,再根據String file = this.servlet.getInitParameter("abc");擷取相對的WEB-INF的相對路徑。
  例:
  InputStream input =Thread.currentThread().getContextClassLoader().getResourceAsStream("abc.properties"); 
  Properties prop = new Properties();
  prop.load(input);
  input.close();

  prop.setProperty("abc", “test");
  prop.store(new FileOutputStream(path), “–test–"); 
  out.close(); 

  2.直接在jsp中操作,通過jsp內建對象擷取可操作的絕對位址。

  // jsp頁面
  String path = pageContext.getServletContext().getRealPath("/");
  String realPath = path+"/WEB-INF/classes/abc.properties";

  //java 程式
  InputStream in = getClass().getClassLoader().getResourceAsStream("abc.properties"); // abc.properties放在webroot/WEB-INF/classes/目錄下
  prop.load(in);
  in.close();

  轉載自:51144588/

   另外一篇關於絕對路徑。相對路徑的重要文章:38753047

 

  file類的相對路徑和絕對路徑 

 

  File類是用來構造檔案或檔案夾的類,在其建構函式中要求傳入一個String類型的參數,用於指示檔案所在的路徑.以前一直使用絕對路徑作為參數,其實這裡也可以使用相對路徑.使用絕對路徑不用說,很容易就能定位到檔案,那麼使用了相對路徑

  jvm如何定位檔案的呢?

  按照jdk Doc上的說法”絕對路徑名是完整的路徑名,不需要任何其他資訊就可以定位自身表示的檔案。相反,相對路徑名必須使用來自其他路徑名的資訊進行解釋。預設 情況下,java.io 包中的類總是根據目前使用者目錄來分析相對路徑名。此目錄由系統屬性 user.dir 指定,通常是 Java 虛擬機器的調用目錄.”

相對路徑顧名思義,相對於某個路徑,那麼究竟相對於什麼路徑我們必須弄明白.按照上面jdk文檔上講的這個路徑是”目前使用者目錄”也就是”java虛擬機器的調用目錄”.更明白的說這個路徑其實是我們在哪裡調用jvm的路徑.舉個例子:

假設有一java源檔案Example.java在d盤根目錄下,該檔案不含package資訊.我們進入命令列視窗,然後使用”d:”命令切換到d盤根 目錄下,然後用”javac Example.java”來編譯此檔案,編譯無錯後,會在d盤根目錄下自動產生”Example.class”檔案.我們在調用”java Example”來運行該程式.此時我們已經啟動了一個jvm,這個jvm是在d盤根目錄下被啟動的,所以此jvm所載入的程式中File類的相對路徑也 就是相對這個路徑的,即d盤根目錄:D:\.同時” 目前使用者目錄”也是D:\.在System.getProperty(“user.dir”);系統變數”user.dir”存放的也是這個值.

我們可以多做幾次實驗,把”Example.class”移動到不同路徑下,同時在那些路徑下,執行”java Example”命令啟動jvm,我們會發現這個”目前使用者目錄”是不斷變化的,它的路徑始終和我們在哪啟動jvm的路徑是一致的.

搞清了這些,我們可以使用相對路徑來建立檔案,例如:

File file = new File(“a.txt”);

File.createNewFile();

假設jvm是在”D:\”下啟動的,那麼a.txt就會產生在D:\a.txt;

此外,這個參數還可以使用一些常用的路徑表示方法,例如”.”或”.\”代表目前的目錄,這個目錄也就是jvm啟動路徑.所以如下代碼能得到目前的目錄完整路徑:

File f = new File(“.”);

String absolutePath = f.getAbsolutePath();

System.out.println(absolutePath);//D:\

最後要說說在eclipse中的情況:

Eclipse中啟動jvm都是在項目根路徑上啟動的.比如有個項目名為blog,其完整路徑為:D:\work\IDE\workspace \blog.那麼這個路徑就是jvm的啟動路徑了.所以以上代碼如果在eclipse裡運行,則輸出結果為” D:\work\IDE\workspace\blog.”

Tomcat中的情況.

如果在tomcat中運行web應用,此時,如果我們在某個類中使用如下代碼:

File f = new File(“.”);

String absolutePath = f.getAbsolutePath();

System.out.println(absolutePath);

那麼輸出的將是tomcat下的bin目錄.我的機器就是” D:\work\server\jakarta-tomcat-5.0.28\bin\.”,由此可以看出tomcat伺服器是在bin目錄下啟動jvm 的.其實是在bin目錄下的” catalina.bat”檔案中啟動jvm的.

 

 

 

   附:java的System.getProperty()方法可以擷取的值    :3987198

 

java 絕對路徑 / 相對路徑總結

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.