现象如下:
可以看到resources目录已经在idea中标记成了资源目录resources root,而且target/classes目录下也编译出了resources目录下的pci.properties文件,换句话说:java在编译时是读取到了resources下的文件的。
可是为什么new File以后做路径判断时为什么返回false,找不到文件呢?
这里需要了解java读取文件的机制:
java读取文件的两种方法:java.io和java.lang.ClassLoader
也就是一个是用java.io,另一个是用类加载器读取文件
使用java.io(File类就是基于此)默认定位到当前用户目录("user.dir")下, 而不是classpath!:
关于这一点:可以通过System.getProperty("user.dir")) 验证:
从上面的代码可以看到System.getProperty("user.dir"))和new File("") 返回的路径是一样的:
都是工程目录的工作路径,这一点从idea的配置也可以看到:
所以如果要读取classPath下的文件,一定不要不要使用File类!
此时应该使用类加载器来读取classpath下文件。
idea环境下,默认的classPath是target/classes
资源目录resouces下(是src/main/resources目录,且标记成了Resources Root)的文件在编译时都会自动复制到classpath下。
所以可以通过类加载器按照如下的方式读取资源目录下的文件:
${ClassLoader}.getResource("/${path}")
或者
${ClassLoader}.getResourceAsStream("/${path}")
classLoader可以通过类名.class的方式来获取
需要注意的是:getResource括号里面如果留空,则是从实际编译的路径去查找而不是classpath, 比如:
因为上面的是单元测试,此时getResource留空,则从target/test-classes开始查找
getResource括号里面如果从斜杠"/"开头,则从classpath开始查找(也就是target/class)