
該圖片由Marna Buys在Pixabay上發布
你好,我是看山,
本文聊一聊在 SpringBoot 應用中,訪問加載類路徑(classpath)中的檔案內容的多種方法,
通過Resource介面
Resource介面抽象出一種更底層的方式管理資源,可以實作通過統一的方式處理各類檔案資源,下面是幾種獲取資源實體的方法,
手動加載
訪問類路徑中的檔案,我們可以直接使用ClassPathResource加載內容,比如:
new ClassPathResource("data/resource-data.txt");
默認情況下,ClassPathResource會在執行緒的背景關系類加載器和默認系統類加載器之間進行選擇,以洗掉樣板檔案,我們也可以直接指定類加載器,比如:
new ClassPathResource("data/resource-data.txt", this.getClass().getClassLoader());
或者是通過指定類的類加載器:
new ClassPathResource("data/resource-data.txt", Employee.class.getClassLoader());
從Resource物件,我們可以很容易的將其轉換為InputStream或File物件,
上面說的方式都是相對于類路徑的地址,如果想要指定某個類的相對路徑,我們和可以通過指定具體類來定義,比如:
new ClassPathResource("../../../data/resource-data.txt", Example.class).getFile();
這樣就是相對于Example的相對路徑了,在實際使用中,不太建議通過類獲取其相對路徑的檔案,這樣會將類與檔案的相對坐標系結,如果修改了類的包路徑,但是忘記修改檔案位置,就會出現錯誤,而且,大家現在一般是使用 Maven 之類的包管理器管理,可以直接在resources目錄中定義組態檔,使用類路徑的相對地址加載檔案即可,
通過@Value自動轉換
我們還可以使用@Value直接注入Resource物件,比如:
@Value("classpath:data/resource-data.txt")
Resource resourceFile;
@Value還能支持其他的加載協議,比如file:或url:,
通過ResourceLoader加載
我們還能使用注入ResourceLoader來實作資源的懶加載,比如,先注入ResourceLoader實體:
@Autowired
ResourceLoader resourceLoader;
然后在我們需要的地方,通過ResourceLoader實體加載資源:
resourceLoader.getResource("classpath:data/resource-data.txt");
在 Spring 中,ApplicationContext實作了ResourceLoader,所以,我們也可以直接通過ApplicationContext實體加載資源,比如:
ApplicationContext context;
public Resource loadEmployeesWithApplicationContext() {
return context.getResource("classpath:data/resource-data.txt");
}
使用ResourceUtils加載資源
在 Spring 內部,還提供了一個工具類ResourceUtils,可以很方便的獲取類路徑中額資源,但是通過這個類的 Javadoc 可以看到,這個類主要是在 Spring 內部使用,也就是說,不太推薦這種用法,不過我們可以了解一下:
public File loadEmployeesWithSpringInternalClass()
throws FileNotFoundException {
return ResourceUtils.getFile(
"classpath:data/resource-data.txt");
}
我們可以了解其內部實作,但是還是建議使用其他更加標準的做法,
讀取資源中的內容
上面都是通過各種方式獲取了Resource資源,接下來我們就聊聊如果獲取資源物件的資料,
比如,我們的資源檔案內容如下:
站點:https://www.howardliu.cn
作者:看山
公號:看山的小屋 (kanshanshuo)
關注公號得福利:不知道多少 G 的資料(電子書、視頻等等)
通過File物件讀取
我們可以使用getFile方法得到File實體,就可以用讀取File物件的方式讀取檔案了,比如:
@Test
File resource = new ClassPathResource("data/resource-data.txt").getFile();
String content = new String(Files.readAllBytes(resource.toPath()));
但是這種方式不適用與讀取 jar 包中的檔案,鑒于現在很多應用都是通過 FatJar 方式部署,我們還需要找找其他方式,
通過InputStream物件讀取
File物件不適合 jar 包中資源讀取的原因在于檔案路徑格式不一樣,所以我們可以直接將資源內容讀取為流的形式,這樣就沒有檔案路徑的問題了,比如:
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 實戰》是一個系列,我會通過實戰+原理的方式完整整個專欄,可以關注公眾號「看山的小屋」回復 spring 獲取原始碼,
推薦閱讀
- SpringBoot 實戰:一招實作結果的優雅回應
- SpringBoot 實戰:如何優雅的處理例外
- SpringBoot 實戰:通過 BeanPostProcessor 動態注入 ID 生成器
- SpringBoot 實戰:自定義 Filter 優雅獲取請求引數和回應結果
- SpringBoot 實戰:優雅的使用列舉引數
- SpringBoot 實戰:優雅的使用列舉引數(原理篇)
- SpringBoot 實戰:在 RequestBody 中優雅的使用列舉引數
- SpringBoot 實戰:在 RequestBody 中優雅的使用列舉引數(原理篇)
- SpringBoot 實戰:JUnit5+MockMvc+Mockito 做好單元測驗
- SpringBoot 實戰:加載和讀取資源檔案內容
你好,我是看山,游于碼界,戲享人生,如果文章對您有幫助,請點贊、收藏、關注,我還整理了一些精品學習資料,關注公眾號「看山的小屋」,回復“資料”即可獲得,
個人主頁:https://www.howardliu.cn
個人博文:SpringBoot 實戰:加載和讀取資源檔案
CSDN 主頁:https://kanshan.blog.csdn.net/
CSDN 博文:SpringBoot 實戰:加載和讀取資源檔案內容
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/335544.html
標籤:java
上一篇:Java中陣列的使用
