• Java中几种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的方式来获取。

    参考文献:http://www.cnblogs.com/yjl49/archive/2012/08/08/2628502.html

  • 相关阅读:
    浏览器渲染流程
    MVC模式
    传统的DOM是如何进行渲染的
    报文的概念及理解
    单页面开发与多页面开发的优缺点
    第4次作业
    售票系统
    第三次作业
    第二次作业
    第一次作业
  • 原文地址:https://www.cnblogs.com/sstone/p/7121122.html
Copyright © 2020-2023  润新知