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的類加載器實例

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM