通常情况下,在Java项目中,我们使用的路径都是在拿到类加载路径后,根据相对位置,使用
FilePathTest.class.getResourceAsStream(relativePath);拿到文件。
今天小生不使用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(); 结果等同于类加载的根路径
附测试代码:
package com.rock.test.filePath; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class FilePathTest { public static void main(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(new InputStreamReader(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()); } }