本作品采用知识共享署名-非商业性使用-相同方式共享 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类的定义如下:
如果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类的定义做如下修改:
如果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