File类主要给我们做的工作是根据我们提供的路径字符串,找到文件,然后返回我们一个file实例,然后我们在用流对象封装这个file实例就可以对一个文件操作。这里困惑我们的一个问题是一般情况下我们不想把提供给File的路径字符串用绝对路径字符串写死,写死的后果windows和linux平台不能通用。甚至两个一样的windows电脑都不能直接正确运行。喜欢用相对字符串。用相对路径字符串那么必须有其他路径字符串和相对路径字符串组合一起成为一个绝对路径字符串。现在的问题是这个其他路径字符串(称当前目录)是什么呢?有谁指定。
根据File JDK文档说明,java.io包中所有类,这个基地址由user.dir这个属性制定,也叫当前目录。用下面这段代码可以获取到路径是啥。
System.out.println(System.getProperty("user.dir"));
下面我们做一个实验,一个java文件,在cmd下执行,和在eclipse下执行所输出的异同。
源码
import java.io.*;
public class FileTest{
public static void main(String[] args) throws IOException{
System.out.println(System.getProperty("user.dir"));
System.out.println(new File(".").getCanonicalFile());
//System.out.println(System.getProperties());
}
}
cmd下输出结果
我把java文件放在/home/cindy/eclipseworkspace目录下
javac FileTest.java
java FileTest
输出如下结果,我给定File参数是“.”表示当前目录。说明file确实利用了当前目录去创建一个File实例。而这个当前目录和user.dir是一样的,这个user.dir 是指你执行java yourClass 这个命令所处目录。所以同样一份class文件,在不同目录下执行所输出的user.dir是不一样的。
/home/cindy/eclipseworkspace
/home/cindy/eclipseworkspace
eclipse下输出结果,新建了一个工程singleton_serial,这个输出结果和cmd下执行的结果是不一样的。所以依据user.dir创建文件可能不是很可靠。
/home/cindy/eclipseworkspace/singleton_serial
/home/cindy/eclipseworkspace/singleton_serial
一般情况下我们都是用classpath路径,而不用user.dir路径作为我File类参数的当前目录。
这段代码可以正确知道当前源码文件对于.class文件的路径字符串。
System.out.println(FileTest.class.getResource("/").getFile());
//一般我们创建一个文件File实例
String baseDir=FileTest.class.getResource("/").getFile();
File file=new File(baseDir,"其他相对路径");
//用其他路径替换其他相对路径这个参数,就能获得相对稳定,通用的文件路径代码。