本作品採用知識共用署名-非商業性使用-相同方式共用 2.5 中國大陸許可協議進行許可。
I/O操作在Java中是必須掌握的技術,其中檔案的定位問題就極容易引起思維上的混亂。如下例:
File f1 = new File("/test.txt");
File f2 = new File("test.txt");
我們將“/”開頭的路徑稱為絕對路徑,將非“/”開頭的路徑稱為相對路徑。那麼上面的絕對路徑及相對路徑又分別定位到哪一個檔案上了呢?
要想掌握檔案的定位問題,須瞭解以下幾個概念:
1. 檔案系統的根目錄
在Windows下,每一個分區的根目錄(如C:/ D:/ E:/)都是我們所說的檔案系統的根目錄;在UNIX下,"/"就是檔案系統的根目錄。
2. 程式啟動並執行工作目錄
一個帶有靜態main函數的Java類,需要使用java命令才能夠執行,我們將執行java命令時所處的目錄稱為工作目錄。
3. 類路徑(classpath)
類路徑指的是Java類所在包的根目錄。
4. 包路徑
通常Java類都有自己的包,在檔案系統中,Java類的包以目錄的方式表現。一個Java類所在的目錄稱為這個類的包路徑。
假如,一個cn.net.uglyduck.test.Test類(類名:Test,包名:cn.net.uglyduck.test)的類路徑是
C:/project/bin
則Test類的包路徑則為
C:/project/bin/cn/net/uglyduck/test
如果我們的工作目錄與類路徑相同,則執行Java程式時,不用指定classpath。如:
C:/project/bin>java cn.net.uglyduck.test.Test
如果工作目錄與類路徑不同,則執行Java程式時需要指定classpath。如:
C:/project>java -cp C:/project/bin cn.net.uglyduck.test.Test
在Java中定位資源檔的常用方式有兩種:檔案系統定位方式與類路徑定位方式。
所謂檔案系統定位就是以檔案系統的根目錄為絕對路徑,以程式啟動並執行工作目錄為相對路徑進行資源定位。Java中最常用的以檔案系統定位方式進行處理的類包括File、FileInputStream和FileOutputStream。
例如Test類的定義如下:
import java.io.File;</p><p>public class Test {</p><p> public static void main(String[] args) {</p><p> File f1 = new File("/test1.txt");<br /> File f2 = new File("test2.txt");</p><p> System.out.println("/test1.txt --> " + f1.getAbsolutePath());<br /> System.out.println("test2.txt --> " + f2.getAbsolutePath());<br /> }<br />}
如果Test類的類路徑為C:/project/bin,我們在C:/project下執行程式,命令列如下:
C:/project>java -cp C:/project/bin cn.net.uglyduck.test.Test
得到的結果是:
/test1.txt --> C:/test1.txt
test2.txt --> C:/project/test2.txt
所謂類路徑定位就是以類路徑為絕對路徑,以包路徑為相對路徑進行資源定位。Java類的靜態方法getResource或getResourceAsStream就是以類路徑的方式進行資源定位。
例如Test類的定義做如下修改:
package cn.net.uglyduck.test; </p><p>import java.net.URL; </p><p>public class Test {</p><p> public static void main(String[] args) {</p><p> URL url1 = Test.class.getResource("/test1.txt");<br /> URL url2 = Test.class.getResource("test2.txt");</p><p> System.out.println("/test1.txt --> " + url1);<br /> System.out.println("test2.txt --> " + url2);<br /> }<br />}
如果Test類的類路徑為C:/project/bin,我們在C:/project下執行程式,命令列如下:
C:/project>java -cp C:/project/bin cn.net.uglyduck.test.Test
得到的結果是:
/test1.txt --> file:/C:/project/bin/test1.txt
test2.txt --> file:/C:/project/bin/cn/net/uglyduck/test/test2.txt