springboot项目打jar包后,代码访问不到resource目录的文件

机缘巧合发现,读取resource目录文件的代码,在本地IDE运行时可以正常工作,但是打jar包后就报文件找不到错误。具体情况如下:

代码是:

    static {
        try {
            File file = ResourceUtils.getFile("classpath:a.txt");
            String str = FileUtils.readFileToString(file, StandardCharsets.UTF_8);
            System.out.println("a.txt content= " + str);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

报错是:

java.io.FileNotFoundException: class path resource [a.txt] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/Users/shengruikou/IdeaProjects/koushr/eurekaserverdemo/target/eurekaserverdemo-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/a.txt

报错剖析:

解决方案:

第1种方法:

用Class的getResourceAsStream(String name)方法,要求入参以"/"开始,代码如下:

第2种方法:

用ClassLoader的getResourceAsStream(String name)方法,入参不能以"/"开始,代码如下:

第3种方法:

用ClassPathResource,代码如下:

    static {
        try {
            ClassPathResource classPathResource = new ClassPathResource("a.txt");
            System.out.println(IOUtils.toCharArray(classPathResource.getInputStream(), StandardCharsets.UTF_8));
            System.out.println(new String(IOUtils.toByteArray(classPathResource.getURL())));
//            System.out.println(FileUtils.readFileToString(classPathResource.getFile(), StandardCharsets.UTF_8));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

ClassPathResource有三个构造方法:

1、ClassPathResource(String path):只传一个路径

2、ClassPathResource(String path, @Nullable Class<?> clazz):传一个路径和一个可为null的类实例

3、ClassPathResource(String path, @Nullable ClassLoader classLoader):传一个路径和一个可为null的类加载器实例

原文地址:https://www.cnblogs.com/koushr/p/13795146.html