如何读取项目资源?(加载文件)

Posted zhuyesan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何读取项目资源?(加载文件)相关的知识,希望对你有一定的参考价值。

一.    getRealPath()    getResource()    getResourceAsStream()    应该使用哪个???
问题:
getRealPath()获得的是绝对路径,getResource()获得的是相对路径,对于开发人员来说都是使用相对路径
如果你使用的是getRealPath(),把项目压缩成.war包后部署到远程服务器后,调用getRealPath会返回null.
为什么?
一个文件被打包.war文件,就不存在目录结构了。所以,对war包中的资源是无法得到RealPath的。 
API描述如下:
技术分享图片

技术分享图片

经过测试:导出war包部署到linux的tomcat服务器上是没有问题的,因为tomcat会自动解压.
一般获取路径为null的问题都出现在weblogic服务器上,因为Weblogic服务器不会自动解包.war
----------------------------------------------------------------------------
二.具体API    
JavaWeb项目对资源文件的读取:Servlet类和普通java类
要点说明:在javaWeb项目中所有src下的资源在部署后都会发布在WEB-INF/classes/下
具体说明:
在Servlet中:默认从webapp(项目根目录)下开始查找 localhost:8080/项目名/
//ServletContext. getResourceAsStream(String path):
//(API要求以"/"开头,测试过加不加"/"都可以)
1.获取项目webapp目录下的资源
    InputStream inputStream1 = context.getResourceAsStream("/make/xlsprint/tOUTPRODUCT.xls");
    InputStream inputStream2 = context.getResourceAsStream("make/xlsprint/tOUTPRODUCT.xls");
2.获取src目录下的资源
    InputStream inputStream3 = context.getResourceAsStream("/WEB-INF/classes/hello.txt");
x
 
1
//ServletContext. getResourceAsStream(String path):
2
//(API要求以"/"开头,测试过加不加"/"都可以)
3
1.获取项目webapp目录下的资源
4
    InputStream inputStream1 = context.getResourceAsStream("/make/xlsprint/tOUTPRODUCT.xls");
5
    InputStream inputStream2 = context.getResourceAsStream("make/xlsprint/tOUTPRODUCT.xls");
6
2.获取src目录下的资源
7
    InputStream inputStream3 = context.getResourceAsStream("/WEB-INF/classes/hello.txt");
8
在普通的java类中:"/"代表src根目录
1. 使用Class获取
    this.getClass().getResourceAsStream(String path);
    path 不以‘/‘开头时默认是从此类所在的包下取资源,以‘/‘开头则是从ClassPath(Src根目录)根下获取。
    其只是通过path构造一个绝对路径,底层还是由ClassLoader获取资源。

2. 使用ClassLoader获取
    this.getClass().getClassLoader().getResourceAsStream(String path) :推荐使用
    不管是不是以"/"开头,都是从ClassPath根目录下获取
1
1. 使用Class获取
2
    this.getClass().getResourceAsStream(String path);
3
    path 不以‘/‘开头时默认是从此类所在的包下取资源,以‘/‘开头则是从ClassPath(Src根目录)根下获取。
4
    其只是通过path构造一个绝对路径,底层还是由ClassLoader获取资源。
5
6
2. 使用ClassLoader获取
7
    this.getClass().getClassLoader().getResourceAsStream(String path) :推荐使用
8
    不管是不是以"/"开头,都是从ClassPath根目录下获取
9

总结:

1.servlet类 从webapp开始,"/"开头
InputStream inputStream = context.getResourceAsStream(String path);
2.普通java类  从classpath开始,"/"开头
InputStream openStream = this.getClass().getClassLoader().getResourceAsStream(String path)
x
1
1.servlet类 从webapp开始,"/"开头
2
InputStream inputStream = context.getResourceAsStream(String path);
3
2.普通java类  从classpath开始,"/"开头
4
InputStream openStream = this.getClass().getClassLoader().getResourceAsStream(String path)

不管是servlet类还是JavaSE类,使用getResource()和getgetResourceAsStream()的路径写法都是一样的;使用效果有一点微小的差别,如下:

------------------------------------------------------------------------

getResourceAsStream()会缓存文件的问题:

getClassLoader().getResourceAsStream会先到缓存中读取文件,若缓存中没有,才会到真正的路径下去读取文件。在不重启tomcat的情况下,修改配置文件,用getResourceAsStream方法不会获取最新的配置文件.


如果需要直接读取配置文件而不重启server,需要替换方法:

getClassLoader().getResource("/....").openStream()

不过对于访问频繁的情况下,不建议用后者,io开销影响性能.


















以上是关于如何读取项目资源?(加载文件)的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Jar 包启动时如何加载外部资源

solr分布式索引实战分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例

如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?

如何读取部署在 Tomcat 中的未爆炸战争文件中的资源文件?

在Java中读取/加载jks cert文件将返回空别名

JAVA读取配置文件的方法