转自http://lanmh.iteye.com/blog/515166
File 类是用来构造文件或文件夹的类 , 在其构造函数中要求传入一个 String 类型的参数 , 用于指示文件所在的路径 . 以前一直使用绝对路径作为参数 , 其实这里也可以使用相对路径 . 使用绝对路径不用说 , 很容易就能定位到文件 , 那么使用了相对路径 jvm 如何定位文件的呢 ?
按照 jdk Doc 上的说法 ” 绝对路径名是完整的路径名,不需要任何其他信息就可以定位自身表示的文件。相反,相对路径名必须使用来自其他路径名的信息进行解释 。默认情况下, java.io
包中的类总是根据当前用户目录 来分析相对路径名。此目录由系统属性 user.dir
指定,通常是 Java 虚拟机的调用目录 . ”
相对路径顾名思义 , 相对于某个路径 , 那么究竟相对于什么路径我们必须弄明白 . 按照上面 jdk 文档上讲的这个路径是 ” 当前用户目录 ” 也就是 ” java 虚拟机的调用目录 ” . 更明白的说这个路径其实是我们在哪里调用 jvm 的路径 . 举个例子 :
假设有一 java 源文件 Example.java 在 d 盘根目录下 , 该文件不含 package 信息 . 我们进入命令行窗口 , 然后使用 ” d: ” 命令切换到 d 盘根目录下 , 然后用 ” javac Example.java ” 来编译此文件 , 编译无错后 , 会在 d 盘根目录下自动生成 ” Example.class ” 文件 . 我们在调用 ” java Example ” 来运行该程序 . 此时我们已经启动了一个 jvm, 这个 jvm 是在 d 盘根目录下被启动的 , 所以此 jvm 所加载的程序中 File 类的相对路径也就是相对这个路径的 , 即 d 盘根目录 :D:/. 同时 ” 当前用户目录 ” 也是 D:/. 在 System.getProperty( “ user.dir ” ); 系统变量 ” user.dir ” 存放的也是这个值 .
我们可以多做几次试验 , 把 ” Example.class ” 移动到不同路径下 , 同时在那些路径下 , 执行 ” java Example ” 命令启动 jvm, 我们会发现这个 ” 当前用户目录 ” 是不断变化的 , 它的路径始终和我们在哪启动 jvm 的路径是一致的 .
搞清了这些 , 我们可以使用相对路径来创建文件 , 例如 :
File file = new File( “ a.txt ” );
File.createNewFile();
假设 jvm 是在 ” D:/ ” 下启动的 , 那么 a.txt 就会生成在 D:/a.txt;
此外 , 这个参数还可以使用一些常用的路径表示方法 , 例如 ” . ” 或 ” ./ ” 代表当前目录 , 这个目录也就是 jvm 启动路径 . 所以如下代码能得到当前目录完整路径 :
File f = new File(“.”);
String absolutePath = f.getAbsolutePath();
System.out.println(absolutePath);//D:/
最后要说说在 eclipse 中的情况 :
Eclipse 中启动 jvm 都是在项目根路径上启动的 . 比如有个项目名为 blog, 其完整路径为 :D:/work/IDE/workspace/blog. 那么这个路径就是 jvm 的启动路径了 . 所以以上代码如果在 eclipse 里运行 , 则输出结果为 ” D:/work/IDE/workspace/blog.”
Tomcat 中的情况 .
如果在 tomcat 中运行 web 应用 , 此时 , 如果我们在某个类中使用如下代码 :
File f = new File(“.”);
String absolutePath = f.getAbsolutePath();
System.out.println(absolutePath);
那么输出的将是 tomcat 下的 bin 目录 . 我的机器就是 ” D:/work/server/jakarta-tomcat-5.0.28/bin/. ”, 由此可以看出 tomcat 服务器是在 bin 目录下启动 jvm 的 . 其实是在 bin 目录下的 ” catalina.bat” 文件中启动 jvm 的 .