機緣巧合發現,讀取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的類加載器實例