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启动路径.所以如下代码能得到当前目录完整路径:
代码如下 | 复制代码 |
File f = new File(“.”);
String absolutePath = f.getAbsolutePath();
System.out.println(absolutePath);//D:
|
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(); } } } |
于是我想到了一个方法:
代码如下 | 复制代码 |
File file = new File("a.txt"); file.createNewFile(); |
我创建这样一个文本文件,看到底它创建在哪里。结果跑到源文件下,发现原来这个文件是创建了与.classpath同一目录下,现在终于知道这个相对路径的问题"
Tomcat中的情况:
如果在tomcat中运行web应用,此时,如果我们在某个类中使用如下代码:
代码如下 | 复制代码 |
File f = new File(“.”);
String absolutePath = f.getAbsolutePath();
System.out.println(absolutePath);
|
补充:Jsp教程,Java基础