最新開發出現一種情況,springboot打成jar包後讀取不到文件,原因是打包之後,文件的虛擬路徑是無效的,只能透過流去讀取。
public void test() { List<String> names = new ArrayList<>(); InputStreamReader read = null; try { ClassPathResource resource = new ClassPathResource("name.txt"); InputStream inputStream = resource.getInputStream(); read = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(read); String txt = null; while ((txt = bufferedReader.readLine()) != null) { if (StringUtils.isNotBlank(txt)) { names.add(txt); } } } catch (Exception e) { e.printStackTrace(); } finally { if (read != null) { try { read.close(); } catch (IOException e) { e.printStackTrace(); } } } }
平常我們寫spring boot 專案的時候偶爾會在後台用到classpath 底下的文件,一般我們都是這樣寫的
File file = ResourceUtils.getFile("classpath:static/image/image");
這樣情況下本來是沒啥問題的。但是用 打jar 包 運行以後就會找不到這個檔案。
Resource下的檔案是存在於jar這個檔案裡面,在磁碟上是沒有真實路徑存在的,它其實是位於jar內部的一個路徑。所以透過ResourceUtils.getFile或this.getClass().getResource("")方法無法正確取得檔案。
對於這種情況。有時候會把專案文件放到專案外邊,但是這樣很容易把這些東西誤刪除掉。
ClassPathResource cpr = new ClassPathResource("static/image/image/kpg"); InputStream in = cpr.getInputStream();
public class ResourceRenderer { public static InputStream resourceLoader(String fileFullPath) throws IOException { ResourceLoader resourceLoader = new DefaultResourceLoader(); return resourceLoader.getResource(fileFullPath).getInputStream(); } }
用法
InputStream in = ResourceRenderer.resourceLoader("classpath:static/image/image");
這樣就完美的解決了jar包底下路徑無法存取的問題。
以上是springboot讀取檔案打成jar包後存取不到怎麼解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!