classpath和读取resources目录下的文件
最近在springboot+maven的項目中去讀取資源文件的時候,報了找不到文件的錯誤。由此展開了對maven項目編譯前和編譯后的目錄結構的了解,以及對java的classpath的理解。
首先,由Maven構建的web工程,java代碼放在src/main/java路徑下,資源(配置文件等)放在src/main/resources路徑下,當構建jar包 或 war包時,JVM虛擬機會自動編譯java文件為class文件存放在 target/classes目錄下,resource資源下的文件會原封不動的拷貝一份到 target/classes 目錄下:而我們一般取的classpath就是target/classes目錄
你可以通過這種方式打印你的calsspath
A.class.getClassLoader().getResource("").getPath();這里又引出一個話題,我們可以根據兩種不同的方式去獲取Resources下的文件
1、class.getResource()
import org.junit.jupiter.api.Test;public class ResourceTestDemo {@Testvoid getResourceTest(){System.out.println(ResourceTestDemo.class.getResource(""));System.out.println(ResourceTestDemo.class.getResource("/"));}打印結果:
1、file:/Users/username/Documents/TestDev/MyTraining/XUnit/ResourceTest/target/classes/3.txt 2、file:/Users/username/Documents/TestDev/MyTraining/XUnit/ResourceTest/target/classes/test/2.txt
結果分析:
1、getResource("")不帶"/“時候是從當前類所在包路徑去獲取資源
2、getResource("/")帶”/"時候是從classpath的根路徑獲取
2、getClassLoader().getResource()
@Testvoid getClassLoaderResourceTest(){System.out.println(ResourceTestDemo.class.getClassLoader().getResource(""));System.out.println(ResourceTestDemo.class.getClassLoader().getResource("/"));}打印結果:
file:/Users/qinzhen/Documents/TestDev/MyTraining/XUnit/ResourceTest/target/test-classes/ nullclass.getResource()不帶"/"時候是從當前類所在包路徑去獲取資源
class.getResource()帶"/"時候是從classpath的根路徑獲取
class.getResource()本質上也是調用了getClassLoader,只是封裝了一層方便了我們使用而已
getClassLoader().getResource("")不帶"/"時候是從classpath的根路徑獲取
getClassLoader().getResource("/")路徑中無法帶有"/"
getResourceAsStream() 方法僅僅是獲取對應路徑文件的輸入流,在路徑的用法上與getResource()一qu
4、批量讀取:
如果想要批量讀區resource下的文件呢?
Resource[] resources = ResourceTestDemo.class.getClassLoader().getResources("validator-config/*.xml"); for (int i = 0; i < resources.length; i++) {InputStream inputStream = resources[i].getInputStream();String xmlContent = IOUtils.toString(inputStream, "UTF-8");System.out.println("content" + i + "=" + xmlContent); }5、如果配置文件中要引用這個文件的路徑呢?
用classpath:xxx.xml 就可以了(xxx.xml放在resources目錄下)。注意是springboot的項目
如果還是取不到,看看你的maven工程的pom文件是否做了過濾文件,比如.keystore文件
<build><resources><resource><directory>src/main/resources</directory><filtering>true</filtering><excludes><exclude>*.keystore</exclude></excludes></resource><resource><directory>src/main/resources</directory><filtering>false</filtering><includes><include>*.keystore</include></includes></resource></resources> </build>?
?
?
?
?
總結
以上是生活随笔為你收集整理的classpath和读取resources目录下的文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据概述【一】
- 下一篇: HTTPS和HTTPS证书