关于如何获取程序中文件目录的问题:
首先理解2个概念
相对路径: 是相对当前工作(也就是当前文件运行的目录)的目录,也就是class文件的目录;
如果我们在C:\ 下java 运行整个程序,那么就是相对于C盘的,如果在别的路径下运行程序,就是相当于别的路径下的路径
绝对路径:就是固定不变的路径。
如果在程序中写死,那么无论整个程序在哪里运行,都会去系统中,查找路径。(如果没有这个盘符呢?那不就gg了)
所以说我们肯定是不能通过绝对路径,来获取文件。(硬编码形式 肯定是不行的)
我们首先要通过软编码形式 获取软件运行的绝对路径+ 在加上 我们相对于软件运行的绝对路径, 从而获取相对路径,来达成效果。
/金山词霸/(相对于金山词霸的)相对路径
所以我们一般只需要获取文件相对于classpath的相对路径就好了
相对路径(相对于文件运行目录,也就是classpath路径)的获取
eclipse工具会自动把src目录下的文件拷贝到classpath目录下,所以 也是相对于src的路径。
src 也就是相当于当前项目的classpath路径。
小知识点: / 斜杠表示根目录, . 小数点表示当前路径 .. 2个小数点表示返回上层目录
获取文件相对路径的2个通用方法:
第一种方式:通过类加载器来获取文件路径 默认路径是classpath的路径(根目录)。
类加载主要是用来加载类的,也就是加载class(字节码)文件的,字节码文件都可以加载,其他文件肯定也是可以加载的。
//测试 默认路径
URL path = ClassPathTest.class.getClassLoader().getResource("."); //获取当前路径
System.out.println(path.getName()); // E:/workspace/day05/bin/ 是classpath的路径
(test1.txt文件的路径为 项目名\src\cn\java\test\test1.txt;类TestAction所在包的第一级目录位于src目录下)
InputStream in = ClassPathTest.class.getClassLoader().getResourceAsStream("cn/java/test/test1.txt");
(test2.txt文件的路径为 项目名\src\test2.txt;类TestAction所在包的第一级目录位于src目录下)
InputStream in = ClassPathTest.class.getClassLoader().getResourceAsStream("test2.txt");
使用ClassLoader时需要主要,文件名不能以/ 斜杠开头, 他默认的路径就是classpath根目录,/斜杠表示根目录,重复了。
第二种方式:通过类来获取文件路径 其实也是通过类加载器来获取路径的 默认路径是当前类所在的路径。
//测试 默认路径
URL path2 = ClassPathTest.class.getResource("."); //获取当前路径
System.out.println(path2.getName()); // E:/workspace/day05/bin/cn/java/test/ 是当前类所在的路径
(test1.txt文件的路径为 项目名\src\cn\java\test\test1.txt;类TestAction所在包的第一级目录位于src目录下)
InputStream in = ClassPathTest.class.getResourceAsStream("test1.txt"); //直接省略包名了。
(test3.txt文件的路径为 项目名\src\cn\java\test\path\test3.txt;类TestAction所在包的第一级目录位于src目录下)
CLassPathTest 这个类存在于项目名\src\cn\java\test\ 包下。
InputStream in = ClassPathTest.class.getClassLoader().getResourceAsStream(".path/test3.txt");
使用.. 返回上层目录 只适合通过第二种方式(通过类)获取文件;第一种方式不适用。