在java中,加载文件资源可用如下四种方式:
1、通过本类的class类的getResource方法
// 同一包下
URL u0 = ClassGetResourceTest.class.getResource("c1.xml")");
System.out.println(u0.toString());
// 从根寻找资源,需要文件分隔符"/"
URL u = ClassGetResourceTest.class.getResource("/c1.xml");
System.out.println(u.toString());
// 不同包下,相对路径
URL u2 = ClassGetResourceTest.class.getResource("/com/test2/c1.xml");
System.out.println(u2.toString());
2、通过本类的ClassLoad的getResource方法
//同一包中寻找
URL u=ClassLoadGetResourceTest.class.getClassLoader().getResource("c1.xml");
System.out.println(u.toString());
//根路径开始寻找
URL u1=ClassLoadGetResourceTest.class.getClassLoader().getResource("c2.xml");
System.out.println(u1.toString());
//不同包中
URL u2=ClassLoadGetResourceTest.class.getClassLoader().getResource("com/test/c1.xml");
System.out.println(u2.toString());
3、通过ClassLoad的getSystemResource()和getSystemClassLoader().getResource()
// 同一包下
URL u2 = ClassLoader.getSystemResource("c1.xml");
URL u3 = ClassLoader.getSystemClassLoader().getResource("c1.xml");
System.out.println(u2.toString());
System.out.println(u3.toString());
// 指定包下且不同包
URL u = ClassLoader.getSystemResource("com/test2/c1.xml");
URL u1 = ClassLoader.getSystemClassLoader().getResource(
"com/test2/c1.xml");
System.out.println(u.toString());
System.out.println(u1.toString());
// 从根路径开始
URL u4 = ClassLoader.getSystemResource("c1.xml");
URL u5 = ClassLoader.getSystemClassLoader().getResource("c1.xml");
System.out.println(u4.toString());
System.out.println(u5.toString());
4、通过Thread方式(推荐此种)
//同一包下
URL u=Thread.currentThread().getContextClassLoader().getResource("c1.xml");
System.out.println(u.toString());
//不同包下
URL u1=Thread.currentThread().getContextClassLoader().getResource("com/test2/c1.xml");
System.out.println(u1.toString());
//根路径下
URL u2=Thread.currentThread().getContextClassLoader().getResource("c2.xml");
System.out.println(u2.toString());
总结: 通过以上四种方式比较可知,除第一种方式(通过本类的class类的getResource)在从根路径和其它包路径下加载资源时,需要加相对路径符"/"外,其它加载资源的路径方式基本是一样的。二、三、四方式在加载同包资源和根路径下资源,指定资源的路径是一样的!