一. getRealPath() getResource() getResourceAsStream() 应该使用哪个???
问题:
getRealPath()获得的是绝对路径,getResource()获得的是相对路径,对于开发人员来说都是使用相对路径
如果你使用的是getRealPath(),把项目压缩成.war包后部署到远程服务器后,调用getRealPath会返回null.
为什么?
如果你使用的是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开销影响性能.