Spring 资源获取 --Resource

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()这种以流的形式读取文件的方式,所以使用读取文件流就可以拿到了。

原文地址:https://www.cnblogs.com/chwy/p/13622475.html