亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解決SpringBoot jar包中的文件讀取問(wèn)題實(shí)現(xiàn)

 更新時(shí)間:2020年08月27日 09:12:50   作者:程序員小明  
這篇文章主要介紹了解決SpringBoot jar包中的文件讀取問(wèn)題實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

背景

這個(gè)問(wèn)題是在一次使用freemarker模版引擎導(dǎo)出word報(bào)告時(shí)發(fā)現(xiàn)的。大概說(shuō)一下docx導(dǎo)出java實(shí)現(xiàn)思路:導(dǎo)出word的文檔格式為docx,事先準(zhǔn)備好一個(gè)排好版的docx文檔作為模版,讀取解析該模版,將其中的靜態(tài)資源替換再導(dǎo)出。

docx文檔本身其實(shí)是一個(gè)壓縮的zip文件,將其解壓過(guò)后就會(huì)發(fā)現(xiàn)它有自己的目錄結(jié)構(gòu)。

問(wèn)題

這個(gè)docx文檔所在目錄如下圖所示:

在本地調(diào)試時(shí),我使用如下方式讀?。?/p>

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

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

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

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

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

定位文件,就會(huì)拋出java.io.FileNotFoundException。

解決

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

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

拿到流之后,就可以將其轉(zhuǎn)換為任意一個(gè)我們需要的對(duì)象,比如File、String等等,此處我要獲取docxTemplate.docx下的目錄結(jié)構(gòu),因此我需要一個(gè)File對(duì)象,代碼舉例如下:

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的工具類即可轉(zhuǎn)換
    FileUtils.copyToFile(inputStream,docxFile);
    ZipFile zipFile = new ZipFile(docxFile);
    Enumeration<? extends ZipEntry> zipEntrys = zipFile.entries();
    // todo 記得關(guān)閉流
  }

結(jié)果

打包、發(fā)布至beta環(huán)境,親測(cè)可用,問(wèn)題完美解決。

到此這篇關(guān)于解決SpringBoot jar包中的文件讀取問(wèn)題實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot jar包文件讀取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java 定時(shí)同步數(shù)據(jù)的任務(wù)優(yōu)化

    java 定時(shí)同步數(shù)據(jù)的任務(wù)優(yōu)化

    這篇文章主要介紹了java 定時(shí)同步數(shù)據(jù)的任務(wù)優(yōu)化,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • Java初學(xué)者入門之繼承和多態(tài)

    Java初學(xué)者入門之繼承和多態(tài)

    Java 面向?qū)ο缶幊逃腥筇匦裕悍庋b、繼承、多態(tài),學(xué)好繼承和多態(tài)是面向?qū)ο箝_(kāi)發(fā)語(yǔ)言中非常重要的一個(gè)環(huán)節(jié),這篇文章主要給大家介紹了關(guān)于Java初學(xué)者入門之繼承和多態(tài)的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • JavaWeb實(shí)現(xiàn)郵件發(fā)送接收功能

    JavaWeb實(shí)現(xiàn)郵件發(fā)送接收功能

    這篇文章主要為大家詳細(xì)介紹了JavaWeb郵件發(fā)送接收功能的實(shí)現(xiàn),郵件發(fā)送和接收功能是非常常用的功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-12-12
  • java對(duì)list<Object>進(jìn)行手動(dòng)分頁(yè)實(shí)現(xiàn)

    java對(duì)list<Object>進(jìn)行手動(dòng)分頁(yè)實(shí)現(xiàn)

    本文主要介紹了java對(duì)list<Object>進(jìn)行手動(dòng)分頁(yè)實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Springcloud Alibaba超詳細(xì)使用詳解

    Springcloud Alibaba超詳細(xì)使用詳解

    SpringCloudAlibaba是一款優(yōu)秀的微服務(wù)架構(gòu),在市面上有著廣泛的應(yīng)用,這篇文章介紹了SpringCloudAlibaba的一些基本使用,適合初學(xué)者,希望能夠給大家?guī)?lái)幫助
    2024-08-08
  • 如何自定義Jackson序列化?@JsonSerialize

    如何自定義Jackson序列化?@JsonSerialize

    這篇文章主要介紹了如何自定義Jackson序列化?@JsonSerialize,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Protobuf的簡(jiǎn)要介紹及使用詳解

    Protobuf的簡(jiǎn)要介紹及使用詳解

    這篇文章主要介紹了Protobuf的簡(jiǎn)要介紹及使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • ManyToMany單向、雙向:@JoinTable的使用

    ManyToMany單向、雙向:@JoinTable的使用

    這篇文章主要介紹了ManyToMany單向、雙向:@JoinTable的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼的示例代碼

    Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼的示例代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • SpringBoot項(xiàng)目報(bào)錯(cuò):"Error?starting?ApplicationContext...."解決辦法

    SpringBoot項(xiàng)目報(bào)錯(cuò):"Error?starting?ApplicationContext....

    這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目報(bào)錯(cuò):“Error?starting?ApplicationContext.?To?display?the?conditions?report?re-run?...”的解決辦法,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08

最新評(píng)論