java读取classpath下资源的2种方法比较

A.使用ClassLoader.getResourceAsStream()读取资源:

@Test
public void test_ClassLoader_getResourceAsStream() {
	InputStream works = getClass().getClassLoader().getResourceAsStream(
			filename);
	assertNotNull(works);

	InputStream doesnt_work = getClass().getClassLoader()
			.getResourceAsStream("/" + filename);
	assertNull(doesnt_work);
}

B.使用spring上下文来加载资源:

@Test
public void test_ApplicationContext_getResource() {
	ApplicationContext ctx = new ClassPathXmlApplicationContext();
	// !!! dosen't work within tomcat
	Resource may_works = ctx.getResource("classpath:" + filename);
	assertTrue(may_works.exists());

	Resource always_works = ctx.getResource("classpath:/" + filename);
	assertTrue(always_works.exists());
}

下面来分析两种方法的适用情况:

方法A:
pros:不依赖额外的包,干净。
cons:资源和调用类必须由同一个(或有继承关系的)Classloader加载,否则找不到资源文件。例如在tomcat环境中,若资源文件和调用类的jar包分离,有可能出现找不到资源的情况。

方法B:
pros:只要在classpath下,就可以找到资源。
cons:需要依赖spring的包。

对于我来说,简单的应用,使用方法A就可以。
复杂些的应用,一般会使用spring,很多资源文件都使用依赖注入,使用方法B的情况很少。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.