A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何竹冬 中级黑马   /  2013-1-6 14:23  /  2090 人查看  /  5 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何竹冬 于 2013-1-6 17:17 编辑

张孝祥老师在讲反射的时候说到可以用一个类的加载器调用getResourceAsStream方法获取到加载这个类的目录下指定的文件,也就是classpath下指定的文件,
有点不明白,这个类不是在某个包里吗,路径应该是classpath下的某个包啊?

5 个回复

倒序浏览
本帖最后由 徐帅 于 2013-1-6 14:41 编辑

    在源目录(.java文件所在目录)下存放自己的资源,eclipse会自动把 .java文件编译成class文件,并存放到classpath下,
而将非.java文件原封不动的按目录结构移动到classpath下。所以我们可以使用类加载器来加载资源文件,但是这种方式是只读的。
所以我们若是想对文件进行写入,应该使用IO流来读取
    这里所有的相对都是相对于.java文件的所在目录,也是就说在使用相对路径时,开始的路径都是此路径,我这里的相对路径是cn.java.test
下面列举3种使用类加载器加载的方法:

1、当资源在相对路径cn.java.test下(注意cn前面没有’/’):
ClassName.class.getClassLoader().getResourceAsStream(“cn/java/test/config.properties”);

2、比较简便的方式:
ClassName.class. getResourceAsStream(“config.properties”);

3、绝对方式(相对于第2种方式,较复杂):
ClassName.class.getResourceAsStream(“/cn/java/test/config.properties”)

评分

参与人数 2技术分 +2 收起 理由
舒远 + 1 赞一个!
Rancho_Gump + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
徐帅 发表于 2013-1-6 14:39
在源目录(.java文件所在目录)下存放自己的资源,eclipse会自动把 .java文件编译成class文件,并存放 ...

你好
class文件不是在classpath下的某个包里吗
回复 使用道具 举报
使用类加载器加载资源文件:

现有类目录结构如下:工程根路径/bin/com/test/reflect/ReflectTest.java

资源文件路径:工程根路径/bin/com/test/reflect/config.properties

则在ReflectTest.java中调用资源文件有如下几种写法

1.  InputStream ips = new FileInputStream("bin/com/test/reflect/config.properties");//使用IO的绝对路径形式。

2.  InputStream ips =ReflectTest.class.getResourceAsStream("config.properties");//class直接找资源的方法,当前路径为ReflectTest.java类文件所在路径。

3.  InputStream ips =ReflectTest.class.getClassLoader().getResourceAsStream("com/test/reflect/config.properties");//使用类加载器找到classpath路径的方法。推荐并常用的方法。

4.     InputStream ips = ReflectTest.class.getResourceAsStream("/com/test/reflect/config.properties");//此方法为相对于根路径的全路径写法。
回复 使用道具 举报
何竹冬 发表于 2013-1-6 15:11
你好
class文件不是在classpath下的某个包里吗


在加载文件的时候,虚拟机会自动到classpath下去找.class文件,所以我们不需要指定classpath,平时我们在运行某个程序时,
其实就是运行的其.class的字节码文件,所以每次都要将源文件编译成字节码文件,虚拟机只认得字节码文件,所以我们不需
要指定,虚拟机会自己去找。希望对你有帮助。
回复 使用道具 举报
多谢大家
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马