java资源获取分析

  在开发java程序的历程中,我们经常要做的一件事就是获取资源。那么什么是资源呢?说白了,在盘算机里那就是一堆数据。只是这堆数据对我们的java程序有多种表现 情势,一般来说有File,URL,InputStream等等。而单就文件这一项就有很多种:配置文件,java类文件,jps文件,图片、css、js文件等等。面对这林林总总的资源,我们在设计一个读取资源的接口时,就需要 针对不同情势的资源供给法子 ,这样就导致我们的接口还是与实际的资源情势绑定在一起,未能完整的抽象。另外,在java程序中资源的寄放地位也是各异的。有的寄放在classpath中,有的寄放在文件系统 中,有的寄放在web利用中。而对于不同地位的资源,java程序获取这些资源的法子 各有不同。

    A、获取classpath中的资源:

    代码

 
  URL url = this.getClass().getResource("resource_name");

    URL url = this.getClass().getClassLoader().getResource("resource_name");

    URL url = Thread.currentThread().getContextClassLoader().getResource("resource_name");
    甜性涩爱

    那么在jdk中为什么又供给了三种法子 来获取classpath下的资源呢?这其中是有些来头的。

    第一行代码中是利用 Class类的实例来获取,第二行代码是应用加载当前类的classloader来获取。看下jdk中的源代码会创造class类的实例最后还是委托加载他的classloader来获取资源的。

    代码

    public java.net.URL getResource(String name) {

    name = resolveName(name);

    ClassLoader cl = getClassLoader0();

    if (cl==null) {

    // A system class.

    return ClassLoader.getSystemResource(name);

    }

    return cl.getResource(name);

    }

    从上面的代码中可以看出,对于资源的加载并没有像类加载所采纳的双亲委托机制。而是当前类的classloader不为null的情况 下先从当前类的classloader中加载资源。而只有当前类的classloader为null的时候才从system classloader中去加载资源。这样可以方便 我们自定义配置类笼罩一些默认配置。当然,j2se利用中如果没有特别 定制classloader时,我们自己写的类都是被system classloader加载的。到底利用 class去获取资源和利用 classloader去获取资源有什么差别呢?差别就在 resolveName(name)这个法子 中。两种法子 对于资源名称的表现法子 不同。下面是一个简略的包结构 ,/表现类路径的根

    /

    |-com.cn.test

    |-Test.class

    |-test2.txt

    |-test1.txt

    Java代码

    // 获取与当前类在同一个包下的资源
    URL url1 = this.getClass().getResource("test2.txt");
    // 获取com.cn.test包下的资源,需加/

  
 URL url2 = this.getClass().getResource("/com/cn/test/test2.txt");

    // 获取类路径根下的资源

  
 URL url3 = this.getClass().getClassLoader().getResource("test1.txt");
    // 获取包com.cn.test包下的资源

  
 URL url4 = this.getClass().getResource("com/cn/test/test2.txt");

    而第三利用 当前线程的contextClassLoader来获取资源的解释 可以参考我的另一篇

    B、获取文件系统 中的资源

    Java代码

 
  // 1、获得File对象

  File file = new File("test.txt");  
 // 2、获得File对象的字节流

    InputStream in = new FileInputStream(file);

    值得注意的是在File的结构函数File(String name) 中的name参数可以是相对路径和绝对路径。相对路径是相对于System.getProperties("user.dir")的。

    C、获取web利用中的资源

    Java代码

 
  servletContext.getResourceAsStream(resource_name);
    resource_names为相对于webroot的路径表现。例如获取web.xml,resource_name表现为"/WEB-INF/web.xml"

    面对上面介绍的各种资源表现 情势和寄放地位,难道java中就没有供给一个统一处理 法子 吗?有,java.net.URL。

    从名称上来看 URL(Uniform Resource Locator) 统一资源定位器。看起来很好很强大。但很多时候应用它并不能定位到我们需要 的资源。

    首先,它jdk中体统的URL能造访的非常有限(当然可以进行扩张,不过很麻烦);常用的有http,file,ftp等等。并没有供给对classpath和servletContext中的资源的获取法子 。

    另外,它没有供给确定 资源是否存在的法子 。每次只有等我们真正去获取资源的时候抛出异常才干知道资源无法获取。

    其次,URL这个类的职责未划分明确,既用来表现资源有用来获取其资源。

你可能感兴趣的:(java,jdk,数据结构,Web,J2SE)