在javaEE程序中获取资源文件可以通过当前类的getResource()方法,或者是new File()获取资源。先看看这些方法获取文件的路径。
这个案例里,Test类是在demo1目录下面。所以可以看到,class.getResource("")方法的获取目录是当前类的文件夹,也就是说可以获取和这个类放在一起的文件;而getResource("/"),在参数里以'/'开头,获取目录是在classes文件夹下,也就是所谓的根目录下;而new File()的获取目录是项目文件夹。
下面来做一点实践。
这个是idea的项目目录,我在main文件夹下的几个不同位置放了a.txt,b.txt,c.txt,d.txt四个文件。那要怎么获取他们呢?如果按照之前的结论,a.txt和Test类在同一个文件夹下,可以用Test.getResource("a.txt")直接获取到,b.txt放在类的根目录下,应该可以用getResource("/b.txt")获取。
但是经过实践,这样是根本获取不到文件的。原因也很简单,这个a.txt和b.txt都是在项目的src目录下的,里面只有未编译的.java文件。而我们实际执行.class文件都放在target文件夹里面,当然获取不到放在src文件夹里面的这些txt文件。仔细查看第一张图里的输出结果也能发现,获取的目录都是在target文件夹下的。
于是去找target文件夹下的这个Test.class,可以看到这个demo1文件夹里面根本就没有a.txt,根目录classes文件夹下面也没有b.txt。
那要怎样获取a.txt和b.txt文件呢?getResource()方法已经是不行了,它只能找target下面这个classes目录里的文件。于是需要用new File()的方式,new File() 是在项目文件夹下找,所以只要写new File("src/main/java/com/example/demo1/a.txt")就可以找到a.txt了,其他几个txt文件也都是一样的方式。当然这个方法显然不是很好啊,访问是访问得到,但是其实是和绝对路径差不多的,后期问题肯定是很多的。
这就要讲到四个txt文件里最特殊的c.txt。它放在resource文件夹里面,事实上打开classes文件夹可以发现,idea自动拷贝了一份和resource下面一样的c.txt文件。
事实上,resources文件夹里的所有文件都会原封不动复制一份到target的classes目录下面。所以资源文件最合理的存放位置应该是resources文件夹,然后读取文件的方式应该是用class.getResource("/"),这种开头带斜杠的用法。