欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot讀取resource目錄下文件失敗的原因及解決方案

 更新時(shí)間:2023年08月18日 11:16:37   作者:明天再去學(xué)習(xí)  
在idea中運(yùn)行時(shí),有些resource下文件讀取工具類能夠正常獲取讀取到文件,但是通過java–jar的方式去運(yùn)行jar包,此時(shí)resource下文件讀取工具類讀取文件就失效了,本文就給大家介紹一下SpringBoot讀取resource目錄下文件失敗解決方案,需要的朋友可以參考下

一、背景

最近有個需求,就是需要從resource目錄下讀取文件返回給用戶。在idea中運(yùn)行時(shí),有些resource下文件讀取工具類能夠正常獲取讀取到文件。但是通過java –jar的方式去運(yùn)行jar包,此時(shí)resource下文件讀取工具類讀取文件就失效了。通過查詢搜索,了解到了是讀取的方式導(dǎo)致文件讀取失敗。

二、具體代碼實(shí)現(xiàn)

1、錯誤的resource下文件讀取寫法

這部分代碼展示的是通過運(yùn)行jar包,ClassPathResource工具無法正常讀取到文件

// 讀取resource目下腳本模板文件
String templatePath = "/script/test.py";
ClassPathResource resource = new ClassPathResource(templatePath);
File file;
try {
    file = resource.getFile();
} catch (IOException e) {
    e.printStackTrace();
}

此處的主要做法是:通過ClassPathResource定位到resource目錄下的文件,再通過他去拿到File類型的文件,通過實(shí)踐證明,拿到的File是空的,說明這種方式獲取文件存在問題。

2、正確的resource下文件讀取寫法

// 讀取resource目下腳本模板文件
String templatePath = "/script/test.py";
ClassPathResource resource = new ClassPathResource(templatePath);
BufferedInputStream bis = new BufferedInputStream(resource.getInputStream());

以上的主要做法是:通過ClassPathResource定位到resource目錄下的文件,我們只需要從ClassPathResouce對象中拿到輸入流即可,通過實(shí)踐證明,通過這種方式能夠正常拿到文件輸入流。

三、問題分析

為什么在打成jar包之后,不支持文件通過File定位,只能通過流或在其他方式,抱著疑惑的態(tài)度,我進(jìn)入ClassPathResource類查看是否有什么提示,結(jié)果還真找到了,看如下:

**
 * {@link Resource} implementation for class path resources. Uses either a
 * given {@link ClassLoader} or a given {@link Class} for loading resources.
 *
 * <p>Supports resolution as {@code java.io.File} if the class path
 * resource resides in the file system, but not for resources in a JAR.
 * Always supports resolution as URL.
 *
 * @author Juergen Hoeller
 * @author Sam Brannen
 * @since 28.12.2003
 * @see ClassLoader#getResourceAsStream(String)
 * @see Class#getResourceAsStream(String)
 */
public class ClassPathResource extends AbstractFileResolvingResource {

定位這一句話:

* <p>Supports resolution as {@code java.io.File} if the class path
* resource resides in the file system, but not for resources in a JAR.
* Always supports resolution as URL.

百度大致翻譯如下:

如果類路徑資源駐留在文件系統(tǒng)中,則支持解析為java.io.File,但不支持JAR中的資源。始終支持URL解析)。

所以大致可以理解為,我們通過java –jar運(yùn)行的方式,是無法將resource下的文件解析為java.io.File的。所以當(dāng)我們使用ClassPathResouce時(shí),就可以從中讀取到文件流,或者轉(zhuǎn)化為URL方式進(jìn)行讀取。

至于為什么不能解析為java.io.File,這個感興趣的小伙伴可以去探索一下(我大概猜測一下:jar包就是一個壓縮包,在壓縮的情況下無法解析到文件路徑,而且也無法通過File去定位到j(luò)ar包中的文件)。

四、其他方式讀取resource目錄下文件

InputStream inputStream = this.getClass().getClassLoader().getResource("/script/test.py"
).openStream();
InputStream inputStream = this.getClass().getResourceAsStream("/script/test.py");
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("/script/test.py");

總結(jié):可以看出,以上最終都是通過resource相關(guān)工具定位到文件后,從中拿到輸入流進(jìn)行讀取的。

到此這篇關(guān)于SpringBoot讀取resource目錄下文件失敗的原因及解決方案的文章就介紹到這了,更多相關(guān)SpringBoot讀取resource文件失敗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • WebSocket實(shí)現(xiàn)Web聊天室功能

    WebSocket實(shí)現(xiàn)Web聊天室功能

    這篇文章主要為大家詳細(xì)介紹了WebSocket實(shí)現(xiàn)Web聊天室功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • java中的正則操作方法總結(jié)

    java中的正則操作方法總結(jié)

    關(guān)于正則表達(dá)式的使用,更多的是自己的經(jīng)驗(yàn),有興趣可以參閱相關(guān)書籍。這里主要寫一下java中的正則操作方法
    2013-10-10
  • 用JAVA 設(shè)計(jì)生成二維碼詳細(xì)教程

    用JAVA 設(shè)計(jì)生成二維碼詳細(xì)教程

    本文主要介紹用JAVA 設(shè)計(jì)生成二維碼,這里一步一步詳細(xì)介紹用 java 如何設(shè)計(jì)二維碼,并附有代碼示例以便參考,有需要的小伙伴可以參考下
    2016-08-08
  • Java用數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的示例

    Java用數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的示例

    下面小編就為大家?guī)硪黄狫ava用數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列的示例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • JavaMail實(shí)現(xiàn)發(fā)送超文本(html)格式郵件的方法

    JavaMail實(shí)現(xiàn)發(fā)送超文本(html)格式郵件的方法

    這篇文章主要介紹了JavaMail實(shí)現(xiàn)發(fā)送超文本(html)格式郵件的方法,實(shí)例分析了java發(fā)送超文本文件的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 為什么不要使用 async void的原因分析

    為什么不要使用 async void的原因分析

    這篇文章主要介紹了為什么不要使用 async void的原因分析及解決方法,非常不錯,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-04-04
  • java實(shí)現(xiàn)員工工資管理系統(tǒng)

    java實(shí)現(xiàn)員工工資管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)員工工資管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java 學(xué)習(xí)筆記(入門篇)_java的基礎(chǔ)語法

    java 學(xué)習(xí)筆記(入門篇)_java的基礎(chǔ)語法

    從基礎(chǔ)語法開始,這個語法你也可以理解為英語或是漢語里面的語法,只不過大家各有各的特點(diǎn)和區(qū)別;那么在學(xué)習(xí)的過程中我們就要不斷的積累重要的類和方法,這樣寫程序就會方便快捷了,下面就開始學(xué)習(xí)java的基礎(chǔ)語法
    2013-01-01
  • 一起來看看springboot集成redis的使用注解

    一起來看看springboot集成redis的使用注解

    這篇文章主要為大家詳細(xì)介紹了springboot集成redis的使用注解,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Elasticsearch模糊查詢詳細(xì)介紹

    Elasticsearch模糊查詢詳細(xì)介紹

    這篇文章主要給大家介紹了關(guān)于Elasticsearch模糊查詢的相關(guān)資料,在數(shù)據(jù)庫查詢中模糊查詢是一種強(qiáng)大的技術(shù),可以用來搜索與指定模式匹配的數(shù)據(jù),需要的朋友可以參考下
    2023-09-09

最新評論