Spring把其资源做了一个抽象,底层使用统一的资源访问接口来访问Spring的所有资源。也就是说,不管什么格式的文件,也不管文件在哪里,到Spring 底层, 都只有一个访问接口,Resource。整个Spring的资源定义在spring-core 的包中。
这套接口分为两部分,Resource和ResourceLoader,其中是对资源的抽象,后者负责加载资源。Spring的ApplicationContext实现了ResourceLoader接口。
一、使用 ClassPathResource读取文件
@Test public void testClassPathResource() { String fileName = "111.txt"; ClassPathResource resource = new ClassPathResource(fileName); System.out.println(resource.getFilename()); System.out.println(resource.getDescription()); try { File file = resource.getFile(); String tempString = null; int line = 1; BufferedReader reader = new BufferedReader(new FileReader(file)); while ((tempString = reader.readLine()) != null) { System.out.println("line " + line + ":" + tempString); line++; } reader.close(); }catch (Exception e) { log.error("读取文件异常 , 文件名:{}", fileName, e); } }
执行结果:
111.txt
class path resource [111.txt]
line 1:11111
line 2:22222
line 3:33333
二、使用FileSystemResource读取文件
@Test public void testFileSystemResource() { String fileName = "111.txt"; Resource resource = new FileSystemResource("src/main/resources/111.txt"); System.out.println(resource.getFilename()); System.out.println(resource.getDescription()); try { File file = resource.getFile(); String tempString = null; int line = 1; BufferedReader reader = new BufferedReader(new FileReader(file)); while ((tempString = reader.readLine()) != null) { System.out.println("line " + line + ":" + tempString); line++; } reader.close(); }catch (Exception e) { log.error("读取文件异常 , 文件名:{}", fileName, e); } }
执行结果:
111.txt
file [D:projectsspring-testsrcmain
esources111.txt]
line 1:11111
line 2:22222
line 3:33333
三、使用ResourceLoader
@Test public void testResourceLoader1() { String fileName = "111.txt"; ResourceLoader loader = new DefaultResourceLoader(); Resource resource = loader.getResource(fileName); System.out.println(resource.getFilename()); System.out.println(resource.getDescription()); try { File file = resource.getFile(); String tempString = null; int line = 1; BufferedReader reader = new BufferedReader(new FileReader(file)); while ((tempString = reader.readLine()) != null) { System.out.println("line " + line + ":" + tempString); line++; } reader.close(); }catch (Exception e) { log.error("读取文件异常 , 文件名:{}", fileName, e); } }
执行结果:
111.txt
class path resource [111.txt]
line 1:11111
line 2:22222
line 3:33333
@Test public void testResourceLoader2() { String fileName = "111.txt"; ResourceLoader loader = new DefaultResourceLoader(); Resource resource = loader.getResource("file:src/main/resources/111.txt"); System.out.println(resource.getFilename()); System.out.println(resource.getDescription()); try { File file = resource.getFile(); String tempString = null; int line = 1; BufferedReader reader = new BufferedReader(new FileReader(file)); while ((tempString = reader.readLine()) != null) { System.out.println("line " + line + ":" + tempString); line++; } reader.close(); }catch (Exception e) { log.error("读取文件异常 , 文件名:{}", fileName, e); } }
执行结果:
111.txt
URL [file:src/main/resources/111.txt]
line 1:11111
line 2:22222
line 3:33333
四:注意事项
本地测试可以正常使用Resource进行文件读取操作,但是当打成jar包后, 使用Resource读取文件将会报File not found 的异常。因为在jar包中,读取文件返回的是jar协议地址,jar:file:/xxx/xx.jar!/xxxx, 而Resource中的getFile方法对非file协议的地址,会抛出FileNotFoundException。要想操作jar中的文件,只要用可以读取jar中文件的方式加载即可,比如 xx.class.getClassLoader().getResouceAsStream()这种以流的形式读取文件的方式,所以使用读取文件流就可以拿到了。