码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-03-11 02:44:27      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:技术分享   java   put   key   www.   100%   tab   pat   comment   

一.    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开销影响性能.






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

标签:技术分享   java   put   key   www.   100%   tab   pat   comment   

原文地址:https://www.cnblogs.com/zhuyesan/p/8542697.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!