机缘巧合发现,读取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的类加载器实例