通常我們定位文件都是通過絕對路徑進行定位,比如“F:/Java/bin/test/test.java”,這樣的缺點就是,一旦項目文件移動,這些路徑就完全失效。
所以,下面我們來介紹一種通過相對路徑來定位文件的方法。我用的IDE是eclipse,項目路徑下有src和bin文件夾分別存放,java的源代碼和編譯文件。
如圖,我的工程名是project,在F盤的study目錄下,包名是com.www,源文件是Test.java
我們知道,java的源文件編譯后才能運行,也就是java運行的其實是Ttest.class,而test.class在bin文件目錄下,跟src目錄一點關系也沒有,那么如果要定位src目錄下的文件,就只能使用絕對路徑來定位了。
下面討論,用相對路徑來定位bin目錄下的文件,我們要定位test33.xml 、test22.xml 、test11.xml。定義類名為Test,new一個實例為te。
首先用定位該類:
采用類:Test.class.getClass()
采用實例:te.getClass() ,對象調用時,可以使用this.getClass()
定位www.txt
方法一:String str11 = te.getClass().getResource("www.txt").getFile() ,打印顯示:/D:/study/project/bin/com/www/www.txt
如果想得到一個File類型的文件,使用getFile()方法,將 www.txt 換成 /com/www/www.txt 可得到同樣的結果,這說明getResoure()方法是以bin 目錄為根目錄,可以定位bin目錄下的任何一個文件,只不過它是從class文件所在目錄開始向上找。(我試過定位projrct里面的文件,行不通)
方法二:String str = te.getClass().getClassLoader().getResource("bin.txt").getPath(); 打印顯示:/D:/study/project/bin/bin.txt
如果要定位www.txt文件,可bin.txt 換成 /com/www/www.txt 即可,同樣也是以bin目錄為根目錄,只不過是從bin目錄開始向下找。(同樣bin目錄以上的不行)
加了getClassLoader()方法實際上就是把起始目錄從class文件目錄變成了根目錄。
常用方法:
getResourse( )方法返回的是一個URL類型對象,目前貌似在定位文件上只有getPath()和getFile()方法比較常用。
如果想得到一個File,File file = new File(te.getClass().getResource("www.txt").toURI()) 或
new File(te.getClass().getResource("bin.txt").getFile())
getClassLoader()方法返回的是一個ClassLoader類型對象,他也有getResourse( )方法,相當於多加了一層,后面的都一樣。
getResourceAsStream()方法返回的是一個InputStream類型對象