java getResourceAsStream

Java路徑java

  Java中使用的路徑,分爲兩種:絕對路徑和相對路徑。具體而言,又分爲四種:web

  1、URI形式的絕對資源路徑服務器

  如:file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.beclipse

  URL是URI的特例。URL的前綴/協議,必須是Java熟悉的。URL能夠打開資源,而URI則不行。jsp

  URL和URI對象能夠互相轉換,使用各自的toURI(),toURL()方法便可!測試

  2、本地系統的絕對路徑this

  D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.bspa

  Java.io包中的類,須要使用這種形式的參數。.net

  可是,它們通常也提供了URI類型的參數,而URI類型的參數,接受的是URI樣式的String。所以,經過URI轉換,仍是能夠把URI樣式的絕對路徑用在java.io包中的類中。對象

  3、相對於classpath的相對路徑

  如:相對於

  file:/D:/java/eclipse32/workspace/jbpmtest3/bin/這個路徑的相對路徑。其中,bin是本項目的classpath。全部的Java源文件編譯後的.class文件複製到這個目錄中。

  4、相對於當前用戶目錄的相對路徑

  就是相對於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)也是如此。

  經過查看ClassLoader類及其相關類的源代碼,我發現,它實際上仍是使用了URI形式的絕對路徑。經過獲得當前classpath的 URI形式的絕對路徑,構建了相對路徑的URI形式的絕對路徑。(這個其實是猜測,由於JDK內部調用了SUN的源代碼,而這些代碼不屬於JDK,不是開源的。) 相對路徑本質上仍是絕對路徑

  所以,歸根結底,Java本質上只能使用絕對路徑來尋找資源。全部的相對路徑尋找資源的方法,都不過是一些便利方法。不過是API在底層幫助咱們構建了絕對路徑,從而找到資源的!

  獲得classpath和當前類的絕對路徑的一些方法

  下面是一些獲得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表示法。

  Web應用程序中資源的尋址

  上文中說過,當前用戶目錄,即相對於System.getProperty("user.dir")返回的路徑。

  對於JavaEE服務器,這多是服務器的某個路徑,這個並無統一的規範!

  而不是咱們發佈的Web應用程序的根目錄!

  這樣,在Web應用程序中,咱們絕對不能使用相對於當前用戶目錄的相對路徑。

  在Web應用程序中,咱們通常經過ServletContext.getRealPath("/")方法獲得Web應用程序的根目錄的絕對路徑。

  這樣,咱們只須要提供相對於Web應用程序根目錄的路徑,就能夠構建出定位資源的絕對路徑。

  這是咱們開發Web應用程序時通常所採起的策略。

   

推薦使用Thread.currentThread().getContextClassLoader().getResource("")來獲得當前的classpath的絕對路徑的URI表示法。

 

Application能夠經過new FileInputStream("xx.properties");直接在classes一級獲取。關鍵是有時咱們須要經過web修改配置文件,咱們不 能將路徑寫死了。通過測試以爲有如下心得:

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();

OutputStream out = new FileOutputStream(path); // path爲經過頁面傳入的路徑

prop.setProperty("abc", 「abcccccc");

prop.store(out, 「–test–");

out.close();

3.只經過Java程序操做資源文件

InputStream in = new FileInputStream("abc.properties"); // 相對路徑,項目下的路徑

OutputStream out = new FileOutputStream("abc.properties");

 

 

來源:http://blog.csdn.net/z69183787/article/details/22774537

相關文章
相關標籤/搜索