当前位置:编程学习 > JSP >>

java.io.File中的绝对路径和相对路径.

按照jdk Doc上的说法”绝对路径名是完整的路径名,不需要任何其他信息就可以定位自身表示的文件。相反,相对路径名必须使用来自其他路径名的信息进行解释。默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 "user.dir" 指定,通常是 Java 虚拟机的调用目录.”
相对路径顾名思义,相对于某个路径,那么究竟相对于什么路径我们必须弄明白.按照上面jdk文档上讲的这个路径是”当前用户目录”也就是”java虚拟机的调用目录”.更明白的说这个路径其实是我们在哪里调用jvm的路径(而非jvm所在的目录,是在指定目录中去调用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的路径是一致的.
1 package hello;
2 public class Test {
3 public static void main(String[] args) {
4 System.out.println("当前用户目录是:" + System.getProperty("user.dir"));
5 }
6 }
复制代码
这里我放置在D盘中编译,运行
在D盘中有如下目录:
可以看见如果加入了package可得目标类所在的包的当前目录(D:/),而不是目标类所在的目录(D:/hello),注意这里的区别.
如果将整个包(D:/hello)移动至其他盘中,如E:,重新编译可得如下结果:
搞清了这些,我们可以使用相对路径来创建文件,例如:
 代码如下 复制代码
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:workIDEworkspaceblog.那么这个路径就是jvm的启动路径了.所以以上代码如果在eclipse里运行,则输出结果为” D:workIDEworkspaceblog.” 但是在创建文件的时候,例如: File file = new File(“a.txt”); 发现是创建在了...blogsrc目录中,如下图:
这样目标文件的生成存放在src目录(.java)中,而不是bin目录(.class)中,这个可能跟eclipse自身的配置文件有关.
这个问题有待牛人指点....
 
以下是网上搜到的相关文章:

http://www.zzzyk.com

"之前一直是在用File中的绝对路径来创建这个File类对象,但是在今天用File类中用相对路径创建时却发现了一个问题,不知道这个相对路径是相对谁面言的。我的程序是这样的:

 代码如下 复制代码
package com.csmz.niit;
import java.io.*;
public class FileDemo {
public static void main(String[] args) throws IOException {
try {
File file=new File("test.txt");
System.out.println("文件是否存在:"+file.exists());
} catch (Exception e) {
e.printStackTrace();
}
}
}
我试着把test.txt拷贝在src下与FileDemo.java放在同一个目录下结果还是显示false。后来我也试着把test.txt拷贝在bin生成的.class文件下,结果还是不行。
于是我想到了一个方法:
 代码如下 复制代码
File file = new File("a.txt");
file.createNewFile();
 
我创建这样一个文本文件,看到底它创建在哪里。结果跑到源文件下,发现原来这个文件是创建了与.classpath同一目录下,现在终于知道这个相对路径的问题"
 
Tomcat中的情况:
如果在tomcat中运行web应用,此时,如果我们在某个类中使用如下代码:
 代码如下 复制代码
File f = new File(“.”);
String absolutePath = f.getAbsolutePath();
System.out.println(absolutePath);
那么输出的将是tomcat下的bin目录.我的机器就是” D:workserverjakarta-tomcat-5.0.28bin.”,由此可以看出tomcat服务器是在bin目录下启动jvm的.其实是在bin目录下的” catalina.bat”文件中启动jvm的.
补充:Jsp教程,Java基础 
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,