springboot讀取文件,打成jar包後訪問不到的解決
springboot讀取文件,打成jar包後訪問不到
最新開發出現一種情況,springboot打成jar包後讀取不到文件,原因是打包之後,文件的虛擬路徑是無效的,隻能通過流去讀取。
文件在resources下
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(); } } } }
springboot打jar包後臺無法訪問靜態文件夾
1.ResourceUtils
平常我們寫spring boot 項目的時候偶爾會在後臺用到classpath 底下的文件,一般我們都是這樣寫的
File file = ResourceUtils.getFile("classpath:static/image/image");
這樣情況下本來是沒啥問題的。但是用 打jar 包 運行以後就會找不到這個文件。
Resource下的文件是存在於jar這個文件裡面,在磁盤上是沒有真實路徑存在的,它其實是位於jar內部的一個路徑。所以通過ResourceUtils.getFile或者this.getClass().getResource(“”)方法無法正確獲取文件。
對於這種情況。有時候會把項目文檔放到項目外邊,但是這樣很容易把這些東西誤刪除掉。
2.ClassPathResource
ClassPathResource cpr = new ClassPathResource("static/image/image/kpg"); InputStream in = cpr.getInputStream();
3. ResourceLoader
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包底下路徑無法訪問的問題。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- springboot讀取resources下文件的方式詳解
- SpringBoot讀取Resource下文件的4種方法
- SpringBoot 如何讀取classpath下的文件
- 解決SpringBoot ClassPathResource的大坑(FileNotFoundException)
- SpringBoot如何獲取src/main/resource路徑下的文件