在获取文件资源时class.getResource()和class.getClassLoader().getResource()的区别

     在我们Java开发中往往需要去获取文件中的内容,一般的我们会使用File的形式获取,如:我要获取“c:\文件.txt”此时我们需要创建一个File的对象File file=new FIle("c:\文件txt");

然后在使用file类创建一个文件文件输入流 :FileInputStream in =new FileInputStream(file),然后再是使用该输入流进行我们想要的操作,但是这样有一个弊端,就是我们的文件路径是一种硬编码的形式,在Java编码过程中我们极其不推荐这种写法。

   当然在web项目下,我们可以通过application对象的getRealPath(“文件名”)的方式获取文件的绝对路径,但是这样也不是很推荐,因此我们可以使用class.getResource(path)和class.getClassLoader(path)方法来获取文件资源,那么我们来研究一下两者的区别:

  

  首先对于class.getResource(path)方法,其中的参数path有两种形式,一种是以“/”开头的,另一种是不以"/"开头;其中前者表示的是从项目的根路径下去获取文件即classPath目录下,而后者则是以该类对象所在位置为根路径来进行查找的(当然这里我们是以.class文件的路径来查找的,因为在Java项目中实际参与我们使用的是Java编译后的class文件,因此我们的目录都是以.class文件所在的目录为着手点的)。

例如下面的结构:


  有一个src文件夹目录,这个是用来存放我们.java文件的源码的叫做源文件夹,还有一个build文件夹这个是存放Java文件编译之后生成的.class文件的地方;

 首先我们先来看一下什么都不获取的情况下我们获取到的路径是什么样的;

package testpackage;
public class TestMain {
    public static void main(String[] args) {
        System.out.println(TestMain.class.getResource(""));
        System.out.println(TestMain.class.getResource("/"));
    }
}


输出结果为:
file:/E:/workspace/Test/bin/testpackage/
file:/E:/workspace/Test/bin/
  我们可以看出没有带“/”我们返回的是TestMain.class这个类所在的目录,而带“/”返回的使我们项目的根目录的路径;
因此,我们在获取获取1—3.properties文件时的采用的方法为:
 
  
 
  
package testpackage;

public class TestMain {

    public static void main(String[] args) {
        // 当前类(class)所在的包目录
        System.out.println(TestMain.class.getResource(""));
        // class path根目录
        System.out.println(TestMain.class.getResource("/"));
        
        // TestMain.class在<bin>/testpackage包中
        // 2.properties  在<bin>/testpackage包中
        System.out.println(TestMain.class.getResource("2.properties"));
        
        // TestMain.class在<bin>/testpackage包中
        // 3.properties  在<bin>/testpackage.subpackage包中
        System.out.println(TestMain.class.getResource("subpackage/3.properties"));
        
        // TestMain.class在<bin>/testpackage包中
        // 1.properties  在bin目录(class根目录)
        System.out.println(TestMain.class.getResource("/1.properties"));
    }
}


class.getResource()和class.getResourceAsStream()方式的使用在路径上是一致的。

Class.getClassLoader().getResource(String path)

该方法中的参数path不能以“/“开头,path表示的是从classpath下获取资源的

package testpackage;
public class TestMain {
    public static void main(String[] args) {
        TestMain t = new TestMain();
        System.out.println(t.getClass());
        System.out.println(t.getClass().getClassLoader());
        System.out.println(t.getClass().getClassLoader().getResource(""));
        System.out.println(t.getClass().getClassLoader().getResource("/"));//null
    }
}

输出结果为:

class testpackage.TestMain
sun.misc.Launcher$AppClassLoader@1fb8ee3
file:/E:/workspace/Test/bin/
null

因此从结果中我们看出 TestMain. class .getResource("/" )  ==  t.getClass().getClassLoader().getResource( "" )

同样的目录,我们使用t.getClass().getClassLoader().getResource("")形式获取的代码如下


package testpackage;

public class TestMain {
    public static void main(String[] args) {
        TestMain t = new TestMain();
        System.out.println(t.getClass().getClassLoader().getResource(""));
        
        System.out.println(t.getClass().getClassLoader().getResource("1.properties"));
        System.out.println(t.getClass().getClassLoader().getResource("testpackage/2.properties"));
        System.out.println(t.getClass().getClassLoader().getResource("testpackage/subpackage/3.properties"));
    }
}
Class.getClassLoader().getResource Class.getClassLoader() .getResourceAsStream在使用时,路径选择上也是一样的

参考博客:http://www.cnblogs.com/yejg1212/p/3270152.html

猜你喜欢

转载自blog.csdn.net/xiongmaodeguju/article/details/70871801