一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 解決SpringBoot jar包中的文件讀取問題實(shí)現(xiàn)

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

2020-08-27 12:43程序員小明 Java教程

這篇文章主要介紹了解決SpringBoot jar包中的文件讀取問題實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

背景

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

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

問題

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

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

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

?
1
2
3
4
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)境卻不可用。拋出異常如下:

?
1
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

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

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

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

解決

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

?
1
2
3
  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ì)象,代碼舉例如下:

?
1
2
3
4
5
6
7
8
9
10
11
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è)可用,問題完美解決。

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

原文鏈接:https://segmentfault.com/a/1190000023777147

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 四虎最新免费网址 | 亚洲欧美久久久久久久久久爽网站 | 污漫日本E同人 | 五月色天在线视频综合观看 | 色视频久久 | 我们日本在线观看免费动漫下载 | 能看的毛片网站 | 欧美国产日本精品一区二区三区 | 日韩一级片在线观看 | 精品一区二区三区在线播放 | 饭冈加奈子乳喷cead144 | 亚洲免费福利视频 | 国产亚洲精品一区在线播 | 国产视频自拍一区 | 女色在线观看免费视频 | 欧美怡红院视频一区二区三区 | 91麻豆国产 | juy_661佐佐木明希在线播放 | 农村妇女野外牲交一级毛片 | 午夜香蕉成视频人网站高清版 | 欧美女孩videos | 欧美在线一级视频 | 亚洲日本中文字幕在线2022 | 国产精品久久久久久久免费大片 | 欧美精品黑人巨大在线播放 | 国产播放器一区 | 无人视频在线观看完整版高清 | 日本在线视频免费看 | 69欧美性猛交 | 亚洲高清在线精品一区 | 亚洲国产成人精品无码区APP | 特黄特色大片免费影院 | 办公室操秘书 | 91看片淫黄大片欧美看国产片 | 日韩在线观看网址 | 包臀裙女教师波多野结衣 | 亚洲 在线 日韩 欧美 | 亚洲AV国产精品无码精 | 国产视频久久 | 毛片免费视频观看 | 欧美破处摘花 |