java普通项目读取不到resources目录下资源文件的解决办法
作者:kingtopest
现象如下:
可以看到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)
总结
到此这篇关于java普通项目读取不到resouces目录下资源文件的解决办法的文章就介绍到这了,更多相关java读取不到resouces资源文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!