本文聊一聊在 SpringBoot 應用中,訪問加載類路徑(classpath)中的文件內容的多種方法。
通過Resource接口
Resource接口抽象出一種更底層的方式管理資源,可以實現通過統一的方式處理各類文件資源。下面是幾種獲取資源實例的方法。
手動加載
訪問類路徑中的文件,我們可以直接使用ClassPathResource加載內容,比如:
1
|
new ClassPathResource( "data/resource-data.txt" ); |
默認情況下,ClassPathResource會在線程的上下文類加載器和默認系統類加載器之間進行選擇,以刪除樣板文件。我們也可以直接指定類加載器,比如:
1
|
new ClassPathResource( "data/resource-data.txt" , this .getClass().getClassLoader()); |
或者是通過指定類的類加載器:
1
|
new ClassPathResource( "data/resource-data.txt" , Employee. class .getClassLoader()); |
從Resource對象,我們可以很容易的將其轉換為InputStream或File對象。
上面說的方式都是相對于類路徑的地址。如果想要指定某個類的相對路徑,我們和可以通過指定具體類來定義,比如:
1
|
new ClassPathResource( "../../../data/resource-data.txt" , Example. class ).getFile(); |
這樣就是相對于Example的相對路徑了。在實際使用中,不太建議通過類獲取其相對路徑的文件。這樣會將類與文件的相對坐標綁定,如果修改了類的包路徑,但是忘記修改文件位置,就會出現錯誤。而且,大家現在一般是使用 Maven 之類的包管理器管理,可以直接在resources目錄中定義配置文件,使用類路徑的相對地址加載文件即可。
通過@Value自動轉換
我們還可以使用@Value直接注入Resource對象,比如:
1
2
|
@Value ( "classpath:data/resource-data.txt" ) Resource resourceFile; |
@Value還能支持其他的加載協議,比如file:或url:。
通過ResourceLoader加載
我們還能使用注入ResourceLoader來實現資源的懶加載,比如,先注入ResourceLoader實例:
1
2
|
@Autowired ResourceLoader resourceLoader; |
然后在我們需要的地方,通過ResourceLoader實例加載資源:
1
|
resourceLoader.getResource( "classpath:data/resource-data.txt" ); |
在 Spring 中,ApplicationContext實現了ResourceLoader,所以,我們也可以直接通過ApplicationContext實例加載資源,比如:
1
2
3
4
5
|
ApplicationContext context; public Resource loadEmployeesWithApplicationContext() { return context.getResource( "classpath:data/resource-data.txt" ); } |
使用ResourceUtils加載資源
在 Spring 內部,還提供了一個工具類ResourceUtils,可以很方便的獲取類路徑中額資源。但是通過這個類的 Javadoc 可以看到,這個類主要是在 Spring 內部使用,也就是說,不太推薦這種用法。不過我們可以了解一下:
1
2
3
4
5
|
public File loadEmployeesWithSpringInternalClass() throws FileNotFoundException { return ResourceUtils.getFile( "classpath:data/resource-data.txt" ); } |
我們可以了解其內部實現,但是還是建議使用其他更加標準的做法。
讀取資源中的內容
上面都是通過各種方式獲取了Resource資源,接下來我們就聊聊如果獲取資源對象的數據。
比如,我們的資源文件內容如下:
站點:https://www.howardliu.cn
作者:看山
公號:看山的小屋關注公號得福利
通過File對象讀取
我們可以使用getFile方法得到File實例,就可以用讀取File對象的方式讀取文件了,比如:
1
2
3
|
@Test File resource = new ClassPathResource( "data/resource-data.txt" ).getFile(); String content = new String(Files.readAllBytes(resource.toPath())); |
但是這種方式不適用與讀取 jar 包中的文件,鑒于現在很多應用都是通過 FatJar 方式部署,我們還需要找找其他方式。
通過InputStream對象讀取
File對象不適合 jar 包中資源讀取的原因在于文件路徑格式不一樣,所以我們可以直接將資源內容讀取為流的形式,這樣就沒有文件路徑的問題了。比如:
1
2
3
4
|
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" )); } |
讀取完畢。
文末總結
本文從加載資源、讀取內容兩個方法講解,給出了多種讀取方式。
到此這篇關于SpringBoot項目實戰之加載和讀取資源文件的文章就介紹到這了,更多相關SpringBoot加載和讀取資源文件內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/liuxinghao/article/details/120930968