關於Java對相對目錄的文件讀寫和調用方法的一些總結java
首先要講Java路徑web
Java中使用的路徑,分爲兩種:絕對路徑和相對路徑。具體而言,又分爲四種:windows
1.本地系統的絕對路徑:服務器
如: windows: C:\abc\ projectName\bin\def. propertiesspa
Linux: /us/home/name/projectName/bin/def.properties線程
Java.io包中的類,須要使用這種形式的參數。可是,它們通常也提供了URI類型的參數,而URI類型的參數,接受的是URI樣式的String。所以,經過URI轉換,仍是能夠把URI樣式的絕對路徑用在java.io包中的類中。對象
2.URI形式的絕對資源路徑ci
如:file:/C:/abc/def.properties資源
URL是URI的特例。URL的前綴/協議,必須是Java熟悉的。URL能夠打開資源,而URI則不行。URL和URI對象能夠互相轉換,使用各自的toURI(),toURL()方法便可!文檔
3.相對於classpath的相對路徑
如:相對於file:/C:/abc/projectName/bin/def. properties/ 這個路徑的相對路徑。其中,bin是本項目的classpath。全部的Java源文件編譯後的.class文件複製到這個目錄中。還要知道src是java文件的目錄,通常的IDE會將src裏面的文件都編譯放到指定的目錄,默認就是項目的bin目錄下
4.相對於當前用戶目錄的相對路徑
就是相對於System.getProperty("user.dir")返回的路徑。
對於通常項目,這是項目的根路徑。對於JavaEE服務器,這多是服務器的某個路徑。這個並無統一的規範!因此,絕對不要使用"相對於當前用戶目錄的相對路徑"。然而默認狀況下,java.io 包中的類老是根據當前用戶目錄來分析相對路徑名。此目錄由系統屬性 user.dir 指定,一般是 Java 虛擬機的調用目錄。這就是說,在使用java.io包中的類時,最好不要使用相對路徑。不然,雖然在J2SE應用程序中可能還算正常,可是到了J2EE程序中,必定會出問題!並且這個路徑,在不一樣的服務器中都是不一樣的!
而後獲取文件路徑
說完了路徑問題如今就要到了使用java類操做本身項目下的文件了進行操做,以properties文件爲例,要學會變通。
那麼咱們如今來看一下可使用那些類來獲取到咱們.java文件 ,或者叫 .class文件的目錄了
如今你能夠想象,我如今在哪一個這個java類裏面的代碼,那我可使用IO流把文件讀取出來,那麼就是利用我如今所在的這個類調用JDK裏面的方法,來找出相對於我這個類的文件地址,它是這個類的同一個目錄仍是在項目的某個位置,若是不是相對的話,那麼你就必須每次都須要修改代碼來肯定文件的位置,這是不明智的選擇,因此仍是利用相對路徑來找到相對應的文件 :這裏我要用到這3個類:
java.lang.System
java.lang.ClassLoader
java.lang.Class
1. java.lang.System
方法: public static String getProperty(String key)
例如:System.getProperty("user.dir");
上面方法在JSE環境(JDK6.0_23)下使用運行結果是項目的文件夾的絕對路徑;在web系統中就不能肯定,好像網上說每一個說法,建議少用,由於下面 的更好用。
2. java.lang.ClassLoader
方法1 :public URL getResource(String name)
查詢JDK能夠知道ClassLoader使用的是 ClassLoader中的URL findResource(String name)方法來得到當前類.class的classpath的,因此要注意的就是傳只name的時候你輸入的是的路徑是相對於classpath的,即:你的類才packet com下,你寫name="def.properties"時候,ClassLoader會找classpath下的def.properties文件 ,而不會去找本身packet下的 com/def.properties文件,若是你想用ClassLoader來讀取com/def.properties文件,那麼你的name應該是name="com/def.properties",而不是name="/com/def.properties",若是寫成name="/com/def.properties",那麼將會錯誤,這個地方要注意的,爲何就要本身看文檔了,我也有點糊塗,但你說爲何有些地方寫成"/com/def.properties",那是由於調用的是ClassLoader中的public static URL getSystemResource(String name),這個下面會講到,若是仍是要問這個不行,那你能夠嘗試兩個方法ClassLoader().getResource("/")和class.getResource("/"),前面的爲空值,後面的就是classpath了,更多的仍是本身去嘗試。
講了ClassLoader獲取路徑問題那麼就該講若是新建ClassLoader,
1.你能夠直接使用ClassLoader,即ClassLoader.getResource("");
2.能夠用當前的Class類來得到Test.class.getClassLoader().getResource("");Test就是當前的類
3.能夠當前線程: Thread.currentThread().getContextClassLoader().getResource("")
上面3種方法都是得到classpath目錄,想指定文件直接相對與classpath來進行修改字符串,注意上面提到的路徑問題
方法 2:public InputStream getResourceAsStream(String name)
路徑解釋和得到方法都同樣,可是返回值是一個InputStream這個在文件操做中比較經常使用
3. java.lang.Class
方法1 :public URL getResource(String name)
這裏主要解釋的就是 Class雖然都是使用ClassLoader實現可是使用的方法不同,查看JDK文檔能夠發現Class使用的是ClassLoader.getSystemResource(java.lang.String)方法實現,這就是Class類中傳遞String name的值存在差別了Class的getResource方法的name字符串若是若是以"/"起始那麼就是表明classpath目錄,若是沒有"/"標誌開頭,那麼就是相對於我當前這個類目錄來和字符串拼接,這就是差異。
可是發現,若是你直接調用ClassLoader.getSystemResource(java.lang.String),也不能使用以"/"的標誌,多是 加載器和類的不一樣把吧,這個也是要注意的。
class的獲取應該不用我說了吧。
方法 2:public InputStream getResourceAsStream(String name)
這個方法和上面的差很少,我也很少說了。
總結一下,文件相對路徑的讀取應該就這麼多了,文件流都出來了,還有什麼是不能解決的呢,如何對properties的讀取這個就不教了,仍是大家本身上網找資料吧。
上面所講的JSE文件讀取,到了JEE,WEB目錄下文件上傳,下載對文件操做讀取還沒講到,到時後再上網差一下資料,總結一些和你們分享吧。
文章寫的很差還但願各位見諒,有錯的提醒我,讓我也少走彎路。
《備註:我的參考了不少網上資料,那個是原版就不知道了,因此沒有出處》