java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java读取不到resources资源文件

java普通项目读取不到resources目录下资源文件的解决办法

作者:kingtopest

这篇文章主要给大家介绍了关于java普通项目读取不到resources目录下资源文件的解决办法,Web项目中应该经常有这样的需求,在maven项目的resources目录下放一些文件,比如一些配置文件,资源文件等,需要的朋友可以参考下

现象如下:

 可以看到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资源文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文