→阿童沐

財富==支撐一個人生存多長時間的能力!

导航

【转】Java相对目录详解

原文链接

File类是用来构造文件或文件夹的类,在其构造函数中要求传入一个String类型的参数,用于指示文件所在的路径.以前一直使用绝对路径作为参数,其实这里也可以使用相对路径.使用绝对路径不用说,很容易就能定位到文件,那么使用了相对路径jvm如何定位文件的呢?

按照jdk Doc上的说法”绝对路径名是完整的路径名,不需要任何其他信息就可以定位自身表示的文件。相反,相对路径名必须使用来自其他路径名的信息进行解释。默认情况下,java.io 包中的类总是根据当前用户目录来分析相对路径名。此目录由系统属性 "user.dir" 指定,通常是 Java 虚拟机的调用目录.”

相对路径顾名思义,相对于某个路径,那么究竟相对于什么路径我们必须弄明白.按照上面jdk文档上讲的这个路径是”当前用户目录”也就是”java虚拟机的调用目录”.更明白的说这个路径其实是我们在哪里调用jvm的路径(而非jvm所在的目录,是在指定目录中去调用jvm).

举个例子:

假设有一java源文件CurrentPath.java在e盘根目录下,该文件不含package信息.我们进入命令行窗口,然后使用”e:”命令切换到e盘根目录下,然后用”javac CurrentPath.java”来编译此文件,编译无错后,会在e盘根目录下自动生成”CurrentPath.class”文件.我们在调用”java CurrentPath”来运行该程序,与此同时,我们已经启动了一个jvm,这个jvm是在e盘根目录下被启动的,所以此jvm所加载的程序中File类的相对路径也就是相对这个路径的,即e盘根目录:E:\". 同时,当前用户目录”也是E:\.在System.getProperty(“user.dir”);系统变量”user.dir”存放的也是这个值.

我们可以多做几次试验,把”CurrentPath.class”移动到不同路径下,同时在那些路径下,执行”java CurrentPath”命令启动jvm,我们会发现这个”当前用户目录”是不断变化的,它的路径始终和我们在哪启动jvm的路径是一致的.

具体如下:

public class CurrentPath
{
public static void main(String[] args)
{
System.out.println(System.getProperty("user.dir"));
}
}


现在加入package,编译运行测试:

package hello;

public class CurrentPath
{
public static void main(String[] args)
{
System.out.println(System.getProperty("user.dir"));
}
}

 

这里我放置在E盘中编译,运行

可以看见如果加入了package可得目标类所在的包的当前目录(E:/),而不是目标.class文件所在的包目录(E:/hello),注意这里的区别.

如果将整个包(E:/hello)移动至其他盘中,如"D:/",重新编译可得如下结果:

 

搞清了这些,我们可以使用相对路径来创建文件,例如:

package hello;

import java.io.*;

public class RelativePath
{
public static void main(String[] args)
{
File f = new File("a.txt");
try
{
f.createNewFile();
}
catch (IOException e)
{
System.out.println("can not create file, please check.");
}
String absolutePath = f.getAbsolutePath();
System.out.println(absolutePath);
}
}

 

 

假设jvm是在”E:\”下启动的,那么a.txt就会生成在E:\a.txt;

此外,这个参数还可以使用一些常用的路径表示方法,例如”.”或”.\”代表当前目录,这个目录也就是jvm启动路径.

 

最后要说说在eclipse中的情况:

Eclipse中启动jvm都是在项目根路径上启动的.比如有个项目名为Blog,其完整路径为:D:\work\IDE\workspace\Blog.那么这个路径就是jvm的启动路径了,即在Eclipse中所创建的项目的根目录。所以以上代码如果在eclipse里运行,则输出结果为” D:\work\IDE\workspace\Blog.” 在创建文件的时候,例如: 

package cn.edu.bupt;

import java.io.File;
import java.io.IOException;

public class TestArray
{
public static void main(String[] args)
{
File f = new File("hello.txt");
System.out.println("JVM启动路径为:" + System.getProperty("user.dir"));
try
{
f.createNewFile();
}
catch (IOException e)
{
System.out.println("cannot create new file.");
}
String absolutePath = f.getAbsolutePath();
System.out.println("文件建立路径为:" + absolutePath);
}
}

会创建在了...\Blog\目录中,如下图:

--------------------------------------------------------------------------------------------------------------------------

以下是网上搜到的相关文章:

http://www.2cto.com/kf/201110/107616.html

"之前一直是在用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:\work\server\jakarta-tomcat-5.0.28\bin\.”,由此可以看出tomcat服务器是在bin目录下启动jvm的.其实是在bin目录下的” catalina.bat”文件中启动jvm的.

posted on 2011-12-08 11:15  阿童沐  阅读(1048)  评论(2编辑  收藏  举报