3、调用ClassLoader的getResourceAsStream方法从类加载路径取得文件的输入流(会通过当前的ClassLoader的findResource方法查找指定文件),请参照:
http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ClassLoader.html#getResourceAsStream%28java.lang.String%29
。
====================================
下面的JdbcUtils.class后面少了个()吗?应该是都可以
Properties prop = new Properties();
prop.load(JdbcUtils.class.getClassLoader().getResourceAsStream("db.properties"));
String driver = prop.getProperty("driver");
Class.forName(driver);
====================================
关于ClassName.
class.getClassLoader的几点说明.
经常希望通过ClassName.
class.getClassLoader().getResourceAsStream(““)来取得properties文件.通常:ClassName.
class.getClassLoader().getResourceAsStream(““)取得的是WEB-INF的下级目录,比如ClassName.
class.getClassLoader().getResourceAsStream(“db.properties“).在Tomcat中,可以通过增加”../”来取得上层目录,即WEB-INF目录,这样就可以把properties放在WEB-INF中统一管理。但是WLS不识别”../”。
另外一种土办法,就是不返回classLoader,直接ClassName.
class.getResourceAsStream()。然后通过多个”../”(小于
6个)来返回相应的上级目录。
当然,如果类扩展了HttpServlet,可以通过getServletContext().getRealPath(
"/")来取得Web部署目录的绝对路径。
====================================
因此,直接调用
this.getClass().getResourceAsStream(String name)
;获取流,静态化方法中则使用
ClassLoader.getSystemResourceAsStream(String name)
; 。
====================================
在JDK中,getResourceAsStream是这样定义的:查找具有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的 class loader 实现的。
因为我是用txt文件当作字典,它存在一个叫dict.aspactword的包下,这样一来,编译后的文件会储存在classPath下,而不是在src下,在动态向字典添加词的时候,classPath下的txt字典没有改变,相对在getResourceAsStream的时候,拿到的自然不是最新的字典,由此感叹,在classPath下如果有不需要改变的文件,在读取时用getResourceAsStream可以保持系统良好的统一性和可移植性,但是在需要改变它们的时候,一定注意修改的路径是classPath下的文件,否则就直接用文件系统的位置来维护你所需要的文件吧
=====================================================================================================
常见的有以下两种获取资源文件的方法:
方法一: App.class.getClassLoader().getResourceAsStream(
String
name)
Returns an input stream for reading the specified resource.
The search order is described in the documentation for
getResource(String)
.
默认从classpath中找文件
(文件放在resources目录下)
,name不能带“/”,否则会抛空指针
方法二: App.class.getResourceAsStream(
String
name)
查找资源通过给定名称,查询资源的规则与给定的类的class load来实现,这个方法由类的loader来执行,如果这个类由bootstrap加载,那么方法由
ClassLoader.getSystemResourceAsStream
代理执行。
代理之前,绝对的资源名称通过传入的name参数以下算法进行构造:
如果name以"/"开头,那么绝对路径是/后边跟的名字
如果name不是以"/"开头,那么绝对路径是package名"."换成“/”以后再加name,
例如:
com.abc.App就是/com/abc/App/name
或者写作 : ../../name(以class所在路径为基准,文件相对于该类的路径)
总结:(表述不清将就着看吧笨人有笨法 o_O ...)
(1)Xxx.class.getClassLoader().getResourceAsStream(String name);
文件放在resources目录下,name写作:"xxx.properties"
(2)Xxx.class.getResourceAsStream(String name);
文件放在任意package下
a.如果同级目录name写作:"xxx.properties";
b.如果在另一package下name写作"../xxpackage/xxx.properties"
=====================================================================================================
另,可参考另一篇文章:
Class.getResource和ClassLoader.getResource的区别分析
在Java中获取资源的时候,经常用到Class.getResource和ClassLoader.getResource,本文给大家说一下这两者方法在获取资源文件的路径差异。
Class.getResource(String path)
path不以'/'开头时,默认是从此类所在的包下取资源;path以'/'开头时,则是从项目的ClassPath根下获取资源。在这里'/'表示ClassPath
JDK设置这样的规则,是很好理解的,path不以'/'开头时,我们就能获取与当前类所在的路径相同的资源文件,而以'/'开头时可以获取ClassPath根下任意路径的资源。
如下所示的例子:
public
static
void
main
(
String
[
]
args
)
System
.
out
.
println
(
Test
.
class
.
getResource
(
""
)
)
;
System
.
out
.
println
(
Test
.
class
.
getResource
(
"/"
)
)
;
public
static
void
main
(
String
[
]
args
)
System
.
out
.
println
(
Test
.
class
.
getClassLoader
(
)
.
getResource
(
""
)
)
;
System
.
out
.
println
(
Test
.
class
.
getClassLoader
(
)
.
getResource
(
"/"
)
)
;
name
=
resolveName
(
name
)
;
ClassLoader
cl
=
getClassLoader0
(
)
;
if
(
cl
==
null
)
// A system class.
return
ClassLoader
.
getSystemResource
(
name
)
;
return
cl
.
getResource
(
name
)
;
String
baseName
=
c
.
getName
(
)
;
int
index
=
baseName
.
lastIndexOf
(
'.'
)
;
if
(
index
!=
-
1
)
name
=
baseName
.
substring
(
0
,
index
)
.
replace
(
'.'
,
'/'
)
+
"/"
+
name
;
}
else
{
//如果是以"/"开头,则去掉
name
=
name
.
substring
(
1
)
;
return
name
;