91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot項目在 jar包中如何實現讀取文件

發布時間:2020-11-06 17:10:13 來源:億速云 閱讀:588 作者:Leah 欄目:開發技術

這期內容當中小編將會給大家帶來有關SpringBoot項目在 jar包中如何實現讀取文件,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

前言

SpringBoot微服務已成為業界主流,從開發到部署都非常省時省力,但是最近小明開發時遇到一個問題:在代碼中讀取資源文件(比如word文檔、導出模版等),本地開發時可以正常讀取 ,但是,當我們打成jar包發布到服務器后,再次執行程序時就會拋出找不到文件的異常。

背景

這個問題是在一次使用freemarker模版引擎導出word報告時發現的。大概說一下docx導出java實現思路:導出word的文檔格式為docx,事先準備好一個排好版的docx文檔作為模版,讀取解析該模版,將其中的靜態資源替換再導出。

docx文檔本身其實是一個壓縮的zip文件,將其解壓過后就會發現它有自己的目錄結構。

問題

這個docx文檔所在目錄如下圖所示:

SpringBoot項目在 jar包中如何實現讀取文件

在本地調試時,我使用如下方式讀取:

import org.springframework.util.ResourceUtils;
  public static void main(String[] args) throws IOException {
File docxTemplate = ResourceUtils.getFile("classpath:templates/docxTemplate.docx");
  }

可以正常解析使用,但是打包發布到beta環境卻不可用。拋出異常如下:

java.io.FileNotFoundException: class path resource [templates/docxTemplate.docx] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/usr/local/subject-server.jar!/BOOT-INF/classes!/templates/docxTemplate.docx

顯而易見,這個異常告訴我們:沒有找到文件,但是將jar包解壓過后,發現這個文件是真真實實存在的。
那這到底是怎么回事呢?這壓根難不倒我。我們要善于透過堆棧信息看本質。通過仔細觀察堆棧信息,我發現此時的文件路徑并不是一個合法的URL(文件資源定位符)。原來jar包中資源有其專門的URL形式: jar:<url>!/{entry} )。所以,此時如果仍然按照標準的文件資源定位形式

File f=new File("jar:file:……");

定位文件,就會拋出java.io.FileNotFoundException。

解決

雖然我們不能用常規操作文件的方法來讀取jar包中的資源文件docxTemplate.docx,但可以通過Class類的getResourceAsStream()方法,即通過流的方式來獲取 :

  public static void main(String[] args) throws IOException {
InputStream inputStream = WordUtil.class.getClassLoader().getResourceAsStream("templates/docxTemplate.docx");
  }

拿到流之后,就可以將其轉換為任意一個我們需要的對象,比如File、String等等,此處我要獲取docxTemplate.docx下的目錄結構,因此我需要一個File對象,代碼舉例如下:

import org.apache.commons.io.FileUtils;

  public static void main(String[] args) throws IOException {
    InputStream inputStream = WordUtil.class.getClassLoader().getResourceAsStream("templates/docxTemplate.docx");
    File docxFile = new File("docxTemplate.docx");
    // 使用common-io的工具類即可轉換
    FileUtils.copyToFile(inputStream,docxFile);
    ZipFile zipFile = new ZipFile(docxFile);
    Enumeration<&#63; extends ZipEntry> zipEntrys = zipFile.entries();
    // todo 記得關閉流
  }

結果

打包、發布至beta環境,親測可用,問題完美解決。

上述就是小編為大家分享的SpringBoot項目在 jar包中如何實現讀取文件了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贺兰县| 南昌市| 乳山市| 永修县| 冀州市| 五原县| 黄陵县| 揭东县| 夏邑县| 山东| 潍坊市| 乌兰察布市| 堆龙德庆县| 南木林县| 乡宁县| 奇台县| 霍山县| 汉中市| 容城县| 宝应县| 徐汇区| 顺昌县| 桂平市| 荣昌县| 三穗县| 恩平市| 利津县| 濉溪县| 晋中市| 乌海市| 泰兴市| 和平区| 门源| 江口县| 南丹县| 昆山市| 宣化县| 大埔县| 香河县| 延庆县| 遂平县|