您好,欢迎访问一九零五行业门户网

Java中的getResourceAsStream用法介绍

用java获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用java的file类,如要取得c:/test.txt文件,就会这样用file file = new file(c:/test.txt);这样用有什么问题,相信大家都知道,就是路径硬编码,对于java精神来说,应用应该一次成型,到处可用,并且从现实应用来讲,最终生成的应用也会部署到windows外的操作系统中,对于linux来说,在应用中用了c:/这样的字样,就是失败,所以,我们应该尽量避免使用硬编码,即直接使用绝对路径。
在servlet应用中,有一个getrealpath(string str)的方法,这个方法尽管也可以动态地获得文件的路径,不秘直接手写绝对路径,但这也是一个不被建议使用的方法,那么,我们有什么方法可以更好地获得文件呢?
      那就是class.getresource()与class.getresourceasstream()方法,但很多人还是不太懂它的用法,因为很多人(比如不久前的我)都不知道应该传怎么样的参数给它,当然,有些人己经用得如火纯青,这些人是不需要照顾的,在此仅给不会或者还不是很熟的人解释一点点。
首先,java中的getresourceasstream有以下几种:
1. class.getresourceasstream(string path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从
classpath根下获取。其只是通过path构造一个绝对路径,最终还是由classloader获取资源。
2. class.getclassloader.getresourceasstream(string path) :默认则是从classpath根下获取,path不能以’/'开头,最终是由
classloader获取资源。
3. servletcontext. getresourceasstream(string path):默认从webapp根目录下取资源,tomcat下path是否以’/'开头无所谓,
当然这和具体的容器实现有关。
4. jsp下的application内置对象就是上面的servletcontext的一种实现。
顺便提下java中类的加载器:
一共有三种加载器
bootstrap classloader :负责加载java核心类( jre 下lib和class目录中的内容)
extension classloader :负责加载java扩展类(jre 下lib/ext 目录中的内容)
system classloader :负责加载应用指定的类 (环境变量classpath中配置的内容)
一个类的加载顺序也是按上面的排列来的,这样就能保证系统的类能先加载。 
与此同时用户也可以自己定义classloader,用来加载特殊的资源。
这里就涉及到 class.getclassloader()  和  thread.currentthread.getcontextclassloader()的区别。
举一个简单的例子:
   假如某天java给我们提供了一个叫 startcamera 的类用来启动电脑的标准摄像头,并将这个类打包在一个jar中。
   正常情况下,我们要启动摄像头时只需将这个jar配置到classpath中。系统启动时system classloader会将这个类加载到应用中。
   但因为摄像头的生产厂家不一样,针对新的设备会有多个不同的startcamera实现,在应用中我们不知道实际的用户会用到哪种。于是我们就自定义了一个classloader,用来针对具体的设备类型加载相应的startcamera类。
   这样一来就出现:优先加载我们定义的类,加载不到的情况下再加载系统的。 这样的需求,是系统默认的父委托加载机制无法满足的。
   thread.currentthread.getcontextclassloader() 就是这样产生的。 我们使用thread.currentthread.setcontextclassloader() 可以为当前线程指定相应的classloader,然后用get的方式来获取。
以上就是java中的getresourceasstream用法介绍的详细内容。
其它类似信息

推荐信息