Java正确地从类路径中获取资源的示例分析

  介绍

这篇文章给大家分享的是有关Java正确地从类路径中获取资源的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

Java可通过以下几种方法来访问资源:

<李>

类的getResource方法

<李>

类加载器的getResource方法

<李>

类加载器的getSystemResource静态方法

在使用中,类可通过直接引用类的类属性而获得,或是通过实例的getClass()方法来获得。获取类加载器的方式则比较多,常见以下几种:

<李>

调用类的getClassLoader方法,如:getClass () .getClassLoader ()

<李>

由当前线程获取类加载器:Thread.currentThread () .getContextClassLoader ()

<李>

获取系统类加载器:ClassLoader.getSystemClassLoader ()

不过,若是对Java的类加载器概念不太了解,最好还是尽量避免使用它。

类。getResource与类加载器。getResource的区别

这两种方式,都接受一个字符串形式的路径表达式,即资源名,并返回找到的资源的URL。两种方式都可用来定位资源,在网络上流传的文章中,两者都是常见的。实际上,类的getResource方法也调用了类加载器的getResource方法,但两者有着很大的不同,不了解这两种方法的区别,就容易造成隐患。隐患经常比编写时就出错要可怕得多,因为它在一定场合下是正常的,不容易被发现。

两者最大的区别,是从哪里开始寻找资源.ClassLoader并不关心当前类的包名路径,它永远以类为基点来定位资源,而类。getResource则不同,如果资源名是绝对路径(以“/翱?,它会将开头的“/叭コ?然后调用类加载器的getResource方法来寻找资源,如果资源名是相对路径,它会在当前的包路径下面寻找资源。

举例来说,假设我们有一个类:测试。应用(包名为测试),并且在测试包下有一个与类名同名的js文件,名为App.js。如果用类加载器来获取这个js文件,应该这样写:

App.class.getClassLoader () .getResource(“测试/App.js");

如果用类的getResource方法,则有两种写法:

<李>

使用相对路径:

App.class.getResource (“App.js"); <李>

使用绝对路径:

App.class.getResource(“/测试/App.js");

从上面的例子,可以看出两者之间巨大的区别。有些人从网络上复制类似的代码,看看不能正确运行,就开始尝试在资源名前加上“/?或是去掉开头的“/笆猿晒α?便算完工,这绝非正道。

类与类加载器的getResource方法还有其它一些不同,对类的getResource方法来说,若传入的是相对路径,它还会尝试做包名与路径名的转换。查看类。getResource方法的源码,可以看到它首先对资源名调用了resolveName方法,然后再调用类加载器的getResource方法来完成资源的定位。

测试代码

作为演示,我写了以下代码来展示类与类加载器的getResource方法的输出:

/* *   ,* Copyright  (c), 2014年,Chen  Zhiqiang  & lt; chenzhiqiang@mail.com>只Released  under 从而MIT 许可。   ,*/package 测试;      import  java.net.URL;   import 活动;/* *   ,* Tests  for 从而use  of  # getResource (String)} {@link 类,和   ,* {@link 类加载器# getResource (String)}。   *大敌;   ,* @author  Chen  Zhiqiang  & lt; chenzhiqiang@mail.com>   ,*/public  class  ClassResourceTest  {   ,,,Class, cls =, ClassResourceTest.class;   ,,,ClassLoader  ldr =, cls.getClassLoader ();,//, Thread.currentThread () .getContextClassLoader ()      ,,,public  static  void  println (Object  s), {   ,,,,,,,System.out.println(年代);   ,,,}      ,,,void  showResource (String 名称),{   ,,,,,,,println (“# #, Test  resource :,”“时间+大敌;;name  +,“”, # #“);   ,,,,,,,println (String.format(“类加载器# getResource (\“% s \“)=% s",,名字,,ldr.getResource(名字)));   ,,,,,,,println (String.format(“类# getResource (\“% s \“)=% s",,名字,,cls.getResource(名字)));   ,,,}   ,,,public  final  void  testForResource (), throws  Exception  {   ,,,,,,,showResource (“;”);   ,,,,,,,showResource (“/?;   ,,,,,,,showResource (cls.getSimpleName (), +,“.class");   ,,,,,,,String  n =, cls.getName () .replace(& # 39;强生# 39;,,& # 39;/& # 39;),+,“.class";   ,,,,,,,showResource (n);   ,,,,,,,showResource (“/? +, n);   ,,,,,,,showResource (“java/lang/Object.class");   ,,,,,,,showResource (“/java/lang/Object.class");   ,,,}      ,,,public  static  void  main (String [], args), throws  Exception  {   ,,,,,,,println (“java.class.path:,“, +, System.getProperty (“java.class.path"));   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Java正确地从类路径中获取资源的示例分析