SpringBoot項(xiàng)目實(shí)戰(zhàn)之加載和讀取資源文件
本文聊一聊在 SpringBoot 應(yīng)用中,訪問加載類路徑(classpath)中的文件內(nèi)容的多種方法。
通過Resource接口
Resource接口抽象出一種更底層的方式管理資源,可以實(shí)現(xiàn)通過統(tǒng)一的方式處理各類文件資源。下面是幾種獲取資源實(shí)例的方法。
手動加載
訪問類路徑中的文件,我們可以直接使用ClassPathResource加載內(nèi)容,比如:
new ClassPathResource("data/resource-data.txt");
默認(rèn)情況下,ClassPathResource會在線程的上下文類加載器和默認(rèn)系統(tǒng)類加載器之間進(jìn)行選擇,以刪除樣板文件。我們也可以直接指定類加載器,比如:
new ClassPathResource("data/resource-data.txt", this.getClass().getClassLoader());
或者是通過指定類的類加載器:
new ClassPathResource("data/resource-data.txt", Employee.class.getClassLoader());
從Resource對象,我們可以很容易的將其轉(zhuǎn)換為InputStream或File對象。
上面說的方式都是相對于類路徑的地址。如果想要指定某個(gè)類的相對路徑,我們和可以通過指定具體類來定義,比如:
new ClassPathResource("../../../data/resource-data.txt", Example.class).getFile();
這樣就是相對于Example的相對路徑了。在實(shí)際使用中,不太建議通過類獲取其相對路徑的文件。這樣會將類與文件的相對坐標(biāo)綁定,如果修改了類的包路徑,但是忘記修改文件位置,就會出現(xiàn)錯誤。而且,大家現(xiàn)在一般是使用 Maven 之類的包管理器管理,可以直接在resources目錄中定義配置文件,使用類路徑的相對地址加載文件即可。
通過@Value自動轉(zhuǎn)換
我們還可以使用@Value直接注入Resource對象,比如:
@Value("classpath:data/resource-data.txt")
Resource resourceFile;
@Value還能支持其他的加載協(xié)議,比如file:或url:。
通過ResourceLoader加載
我們還能使用注入ResourceLoader來實(shí)現(xiàn)資源的懶加載,比如,先注入ResourceLoader實(shí)例:
@Autowired ResourceLoader resourceLoader;
然后在我們需要的地方,通過ResourceLoader實(shí)例加載資源:
resourceLoader.getResource("classpath:data/resource-data.txt");
在 Spring 中,ApplicationContext實(shí)現(xiàn)了ResourceLoader,所以,我們也可以直接通過ApplicationContext實(shí)例加載資源,比如:
ApplicationContext context;
public Resource loadEmployeesWithApplicationContext() {
return context.getResource("classpath:data/resource-data.txt");
}
使用ResourceUtils加載資源
在 Spring 內(nèi)部,還提供了一個(gè)工具類ResourceUtils,可以很方便的獲取類路徑中額資源。但是通過這個(gè)類的 Javadoc 可以看到,這個(gè)類主要是在 Spring 內(nèi)部使用,也就是說,不太推薦這種用法。不過我們可以了解一下:
public File loadEmployeesWithSpringInternalClass()
throws FileNotFoundException {
return ResourceUtils.getFile(
"classpath:data/resource-data.txt");
}
我們可以了解其內(nèi)部實(shí)現(xiàn),但是還是建議使用其他更加標(biāo)準(zhǔn)的做法。
讀取資源中的內(nèi)容
上面都是通過各種方式獲取了Resource資源,接下來我們就聊聊如果獲取資源對象的數(shù)據(jù)。
比如,我們的資源文件內(nèi)容如下:
站點(diǎn):https://www.howardliu.cn
作者:看山
公號:看山的小屋關(guān)注公號得福利
通過File對象讀取
我們可以使用getFile方法得到File實(shí)例,就可以用讀取File對象的方式讀取文件了,比如:
@Test
File resource = new ClassPathResource("data/resource-data.txt").getFile();
String content = new String(Files.readAllBytes(resource.toPath()));
但是這種方式不適用與讀取 jar 包中的文件,鑒于現(xiàn)在很多應(yīng)用都是通過 FatJar 方式部署,我們還需要找找其他方式。
通過InputStream對象讀取
File對象不適合 jar 包中資源讀取的原因在于文件路徑格式不一樣,所以我們可以直接將資源內(nèi)容讀取為流的形式,這樣就沒有文件路徑的問題了。比如:
InputStream resource = new ClassPathResource("data/resource-data.txt").getInputStream();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource))) {
String content = reader.lines().collect(Collectors.joining("\n"));
}
讀取完畢。
文末總結(jié)
本文從加載資源、讀取內(nèi)容兩個(gè)方法講解,給出了多種讀取方式。
到此這篇關(guān)于SpringBoot項(xiàng)目實(shí)戰(zhàn)之加載和讀取資源文件的文章就介紹到這了,更多相關(guān)SpringBoot加載和讀取資源文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java模擬TCP通信實(shí)現(xiàn)客戶端上傳文件到服務(wù)器端
這篇文章主要為大家詳細(xì)介紹了java模擬TCP通信實(shí)現(xiàn)客戶端上傳文件到服務(wù)器端,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
淺談maven 多環(huán)境打包發(fā)布的兩種方式
這篇文章主要介紹了淺談maven 多環(huán)境打包發(fā)布的兩種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
Java讀取properties文件連接數(shù)據(jù)庫的方法示例
這篇文章主要介紹了Java讀取properties文件連接數(shù)據(jù)庫的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-04-04
try-with-resource優(yōu)雅關(guān)閉io流的方法
這篇文章主要給大家介紹了關(guān)于try-with-resource優(yōu)雅關(guān)閉io流的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Spring Data JPA中的Specification動態(tài)查詢詳解
Specification是一個(gè)設(shè)計(jì)模式,用于企業(yè)級應(yīng)用開發(fā)中,其主要目的是將業(yè)務(wù)規(guī)則從業(yè)務(wù)邏輯中分離出來,在數(shù)據(jù)查詢方面,Specification可以定義復(fù)雜的查詢,使其更易于重用和測試,這篇文章主要介紹了Spring Data JPA中的Specification動態(tài)查詢詳解,需要的朋友可以參考下2023-07-07
JAVA 自定義線程池的最大線程數(shù)設(shè)置方法
這篇文章主要介紹了JAVA 自定義線程池的最大線程數(shù)設(shè)置方法,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下2020-06-06

