今天小生不使用classPath,而是直接去使用相对路径来试验。
小生的work space路径是 E:\workspace\springMVCStudy,在该work sapce下创建Java Project,目录如下。
1. 拿到new File("")所对应的绝对路径。
在MyUrlDemo类中,通过
File directory = new File("");
String courseFile = directory.getCanonicalPath();
System.out.println("项目根路径:" + courseFile);
我们直接拿到的是项目根路径。
结果是:::E:\workspace\springMVCStudy\testFilePath
2. test1.txt的路径
由于test1.txt位于项目的根路径下,我们可以直接使用如下方式拿到。
File file1 = new File("test1.txt");
3. test2.txt的路径
由于test2.txt位于src下,照猫画虎
File file2 = new File("src\\test2.txt");
4. test3.txt的路径
由于test3.txt位于src下,再次照猫画虎
File file2 = new File("src\\com\\rock\\testFilePath\\test3.txt");
这样我们拿到了3个文件,但是这样并不保险。因为在开发环境中,我们的文件结构是这样的,但是在测试环境和生产环境中,
我们的代码都是编译之后才才去运行。
在编译之后,上面的test1.txt不能被打到jar包中,也就是说,就不能再通过上面的方法访问test1.txt了。
对于test2.txt和test3.txt,也不能通过上述方法访问,这是因为编译之后就没有src目录了。
以下两种方法可以查看对应的路径,根据该路径可以拼出相对路径,然后使用相应的getResourceAsStream()得到文件的输入流。
1. 获取类的加载路径
当前类的加载路径::this.getClass().getResource("").getPath() 或者MyURLDemo.class.getResource("").getPath()
类加载的根路径::: this.getClass().getResource("/").getPath()
2. 获取类加载器的路径
this.getClass().getClassLoader().getResource("").getPath(); 结果等同于类加载的根路径
附测试代码:
packagecom.rock.test.filePath;importjava.io.BufferedReader;importjava.io.File;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;public classFilePathTest {public static voidmain(String[] args) {//使用文件相对路径
File file1 = new File("test1.txt");
System.out.println("test1.txt exists " +file1.exists());
File file2= new File("src\\test2.txt");
System.out.println("test2.txt exists " +file2.exists());
File file3= new File("src\\com\\rock\\test\\filePath\\test3.txt");
System.out.println("test3.txt exists " +file3.exists());
InputStream stream= FilePathTest.class.getResourceAsStream("/test2.txt");//InputStream stream = FilePathTest.class.getResourceAsStream("test3.txt");//InputStream stream = FilePathTest.class.getClassLoader().getResourceAsStream("test2.txt");
BufferedReader reader = new BufferedReader(newInputStreamReader(stream));
String line= null;try{while((line = reader.readLine()) != null) {
System.out.println(line);
}
}catch(IOException e) {
e.printStackTrace();
}//使用类加载路径获取test2.txt
File file2ByLoard = new File(FilePathTest.class.getResource("/").getPath() + "\\test2.txt");
System.out.println("test2.txt exists by load " +file2ByLoard.exists());
File file2ByLoarder= new File(FilePathTest.class.getClassLoader().getResource("").getPath() + "\\test2.txt");
System.out.println("test2.txt exists by loader " +file2ByLoarder.exists());
File file2ByClasspath= new File(System.getProperty("java.class.path") + "\\test2.txt");
System.out.println("test2.txt exists by Classpath " +file2ByClasspath.exists());
}
}