Java打包之后讀取Resources下的文件失效原因及解決方法
環(huán)境
okey,廢話不多說,發(fā)車了,事情的起因還是源于一道面試筆試機試題目(這里不能透露太多,但是這道題目很有意思,是一個算法應(yīng)用,并且這個算法本身也挺有意思的。寫完算法之后,還要放在Linux環(huán)境當中進行遠程調(diào)試,說明執(zhí)行流程)
那么問題就出現(xiàn)在Java打包之后執(zhí)行代碼的時候出現(xiàn)了問題。 在resources下面的話有一個cars.xlsx文件
起初在我們的 idea環(huán)境下面測試一點問題沒有,直到,我將其打包,并且仔細檢查了jar包發(fā)現(xiàn)文件資源也打包進去之后,程序還是沒有讀取到文件的時候,于是發(fā)現(xiàn)了一個關(guān)于關(guān)于使用:
類名.class.getResource("/cars.xlsx").getPath();
讀取resources的坑。打包之后,它是無法讀取到文件的。
Why
發(fā)現(xiàn)問題,那么就要解決問題,那么問題在哪,憑什么不ok呢。 那么竟然如此,那么我們就要look,look,這個玩意輸出的是什么:
URL resource = Application.class.getResource("/cars.xlsx"); String path = resource.getPath();
返回結(jié)果是:
顯然這個路徑是這個:
這個是由IDEA自己生成的一個路徑,而在我們打包的時候問什么讀取呢? 那么這個時候我們顯然需要去看看打包之后的情況:
顯然打包到的文件,不在com的同級目錄下。
ok,這里我們就明白了一個道理,那就是,之所以找不到,那就是這個打包之后的文件位置放的不一樣。那么問題提出來了,那么如何解決這個問題
解決
okey,解決的方式很簡單:
類名.class.getClassLoader().getResourceAsStream("名字");
欸,這樣一看,好像區(qū)別不大啊,為毛這個可以解決這個問題呢?
對于Class.getResource:
先獲取文件的路徑path,不以’/‘開頭時,默認是從此類所在的包下取資源;path以’/'開頭時,則是從項目的ClassPath根下獲取資源。所以在當前打包之后的 話,我們找不到的,因為這個文件還在外面一層。
對于ClassLoader.getResource:
同樣先獲取文件的路徑,path不以’/'開頭時,首先通過雙親委派機制,使用的逐級向上委托的形式加載的,最后發(fā)現(xiàn)雙親沒有加載到文件,最后通過當前類加載classpath根下資源文件。這樣一來當前類沒找到,但是老爹,老爺,太爺能找到。
在classLoader里面它的一個過程是這樣的:
so,寫的時候:
類名.class.getClassLoader().getResourceAsStream("名字");
總結(jié)
陸續(xù)開始恢復(fù)技術(shù)學(xué)習(xí),停止考研學(xué)習(xí)??佳泻芎?,但是不是適合所有人。不過話說回來,太久沒老老實實寫代碼了,好多東西都忘了,今天上午在做遠程調(diào)試的時候,一直連接不上去,防火墻也放行了,結(jié)果搞了半天,發(fā)現(xiàn)策略組沒放行,無語住了。
以上就是Java打包之后讀取Resources下的文件失效原因及解決方法的詳細內(nèi)容,更多關(guān)于Java打包后讀取Resources下文件失效的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springmvc利用jquery.form插件異步上傳文件示例
本篇文章主要介紹了springmvc利用jquery.form插件異步上傳文件示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-01-01詳解spring-boot下如何滿足多生產(chǎn)環(huán)境中個性化定制功能
這篇文章主要介紹了詳解spring-boot下如何滿足多生產(chǎn)環(huán)境中個性化定制功能,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03教你在?Java?中實現(xiàn)?Dijkstra?最短路算法的方法
這篇文章主要教你在?Java?中實現(xiàn)?Dijkstra?最短路算法的方法,在實現(xiàn)最短路算法之前需要先實現(xiàn)帶權(quán)有向圖,文章中給大家介紹的非常詳細,需要的朋友可以參考下2022-04-04Spring Security賬戶與密碼驗證實現(xiàn)過程
這篇文章主要介紹了Spring Security賬戶與密碼驗證實現(xiàn)過程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03Easypoi 輕松實現(xiàn)復(fù)雜excel文件導(dǎo)出功能
這篇文章主要介紹了Easypoi 輕松實現(xiàn)復(fù)雜excel文件導(dǎo)出功能,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-11-11SpringBoot服務(wù)上實現(xiàn)接口限流的方法
這篇文章主要介紹了SpringBoot服務(wù)上實現(xiàn)接口限流的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10區(qū)分Java中的ArrayList和LinkedList
這篇文章主要介紹了如何區(qū)分Java中ArrayList和LinkedList,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06Java在排序數(shù)組中查找元素的第一個和最后一個位置的方法詳解
相信大家在操作Java的時候經(jīng)常會要在一個數(shù)組(無序)中查找元素的第一個和最后一個位置,下面這篇文章主要給大家介紹了關(guān)于Java在排序數(shù)組中查找元素的第一個和最后一個位置的相關(guān)資料,需要的朋友可以參考下2024-01-01