java普通項目讀取不到resources目錄下資源文件的解決辦法
現(xiàn)象如下:

可以看到resources目錄已經(jīng)在idea中標記成了資源目錄resources root,而且target/classes目錄下也編譯出了resources目錄下的pci.properties文件,換句話說:java在編譯時是讀取到了resources下的文件的。
可是為什么new File以后做路徑判斷時為什么返回false,找不到文件呢?
這里需要了解java讀取文件的機制:
java讀取文件的兩種方法:java.io和java.lang.ClassLoader
也就是一個是用java.io,另一個是用類加載器讀取文件
使用java.io(File類就是基于此)默認定位到當前用戶目錄("user.dir")下, 而不是classpath!:
關于這一點:可以通過System.getProperty("user.dir")) 驗證:

從上面的代碼可以看到System.getProperty("user.dir"))和new File("") 返回的路徑是一樣的:
都是工程目錄的工作路徑,這一點從idea的配置也可以看到:

所以如果要讀取classPath下的文件,一定不要不要使用File類!
此時應該使用類加載器來讀取classpath下文件。
idea環(huán)境下,默認的classPath是target/classes
資源目錄resouces下(是src/main/resources目錄,且標記成了Resources Root)的文件在編譯時都會自動復制到classpath下。
所以可以通過類加載器按照如下的方式讀取資源目錄下的文件:
${ClassLoader}.getResource("/${path}")
或者
${ClassLoader}.getResourceAsStream("/${path}")classLoader可以通過類名.class的方式來獲取
需要注意的是:getResource括號里面如果留空,則是從實際編譯的路徑去查找而不是classpath, 比如:

因為上面的是單元測試,此時getResource留空,則從target/test-classes開始查找
getResource括號里面如果從斜杠"/"開頭,則從classpath開始查找(也就是target/class)
總結
到此這篇關于java普通項目讀取不到resouces目錄下資源文件的解決辦法的文章就介紹到這了,更多相關java讀取不到resouces資源文件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot2.0整合Redis自定義注入bean組件配置的實戰(zhàn)教程
這篇文章主要介紹了SpringBoot2.0整合Redis自定義注入bean組件配置,我們將基于SpringBoot2.0整合搭建的微服務項目為奠基,開啟中間件Redis的實戰(zhàn)之路,需要的朋友可以參考下2023-06-06
Java8 用Lambda表達式給List集合排序的實現(xiàn)
這篇文章主要介紹了Java8 用Lambda表達式給List集合排序的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08
解析ConcurrentHashMap: transfer方法源碼分析(難點)
ConcurrentHashMap是由Segment數(shù)組結構和HashEntry數(shù)組結構組成。Segment的結構和HashMap類似,是一種數(shù)組和鏈表結構,今天給大家普及java面試常見問題---ConcurrentHashMap知識,一起看看吧2021-06-06
SpringCloud如何根據(jù)服務名獲取服務運行實例并進行負載均衡
文章介紹了SpringCloud中使用Nacos作為注冊中心時,服務注冊和發(fā)現(xiàn)的過程,以及如何通過DiscoveryClient接口和LoadBalancerClient類進行服務的負載均衡,感興趣的朋友跟隨小編一起看看吧2025-01-01
spring中IOC控制反轉依賴注入和new對象的區(qū)別說明
這篇文章主要介紹了spring中IOC控制反轉依賴注入和new對象的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02

