您現在的位置是:首頁 > 籃球

springboot中,載入類路徑(classpath)中檔案內容的多種方法

  • 由 Java雲海 發表于 籃球
  • 2022-02-03
簡介透過File物件讀取我們可以使用getFile方法得到File例項,就可以用讀取File物件的方式讀取檔案了,比如:但是這種方式不適用與讀取 jar 包中的檔案,鑑於現在很多應用都是透過 FatJar 方式部署,我們還需要找找其他方式

springboot測試類怎麼寫

本文聊一聊在 SpringBoot 應用中,訪問載入類路徑(classpath)中的檔案內容的多種方法。

透過Resource介面

Resource

介面抽象出一種更底層的方式管理資源,可以實現透過統一的方式處理各類檔案資源。下面是幾種獲取資源例項的方法。

手動載入

訪問類路徑中的檔案,我們可以直接使用

ClassPathResource

載入內容,比如:

springboot中,載入類路徑(classpath)中檔案內容的多種方法

預設情況下,

ClassPathResource

會線上程的上下文類載入器和預設系統類載入器之間進行選擇,以刪除樣板檔案。我們也可以直接指定類載入器,比如:

springboot中,載入類路徑(classpath)中檔案內容的多種方法

或者是透過指定類的類載入器:

springboot中,載入類路徑(classpath)中檔案內容的多種方法

Resource

物件,我們可以很容易的將其轉換為

InputStream

File

物件。

上面說的方式都是相對於類路徑的地址。如果想要指定某個類的相對路徑,我們和可以透過指定具體類來定義,比如:

springboot中,載入類路徑(classpath)中檔案內容的多種方法

這樣就是相對於Example的相對路徑了。在實際使用中,不太建議透過類獲取其相對路徑的檔案。這樣會將類與檔案的相對座標繫結,如果修改了類的包路徑,但是忘記修改檔案位置,就會出現錯誤。而且,大家現在一般是使用 Maven 之類的包管理器管理,可以直接在resources目錄中定義配置檔案,使用類路徑的相對地址載入檔案即可。

透過@Value自動轉換

我們還可以使用@Value直接注入Resource物件,比如:

springboot中,載入類路徑(classpath)中檔案內容的多種方法

@Value

還能支援其他的載入協議,比如

file:

url:

透過ResourceLoader載入

我們還能使用注入

ResourceLoader

來實現資源的懶載入,比如,先注入

ResourceLoader

例項:

springboot中,載入類路徑(classpath)中檔案內容的多種方法

然後在我們需要的地方,透過

ResourceLoader

例項載入資源:

springboot中,載入類路徑(classpath)中檔案內容的多種方法

在 Spring 中,

ApplicationContext

實現了

ResourceLoader

,所以,我們也可以直接透過

ApplicationContext

例項載入資源,比如:

springboot中,載入類路徑(classpath)中檔案內容的多種方法

使用ResourceUtils載入資源

在 Spring 內部,還提供了一個工具類

ResourceUtils

,可以很方便的獲取類路徑中額資源。但是透過這個類的 Javadoc 可以看到,這個類主要是在 Spring 內部使用,也就是說,不太推薦這種用法。不過我們可以瞭解一下:

springboot中,載入類路徑(classpath)中檔案內容的多種方法

我們可以瞭解其內部實現,但是還是建議使用其他更加標準的做法。

透過File物件讀取

我們可以使用

getFile

方法得到

File

例項,就可以用讀取

File

物件的方式讀取檔案了,比如:

springboot中,載入類路徑(classpath)中檔案內容的多種方法

但是這種方式不適用與讀取 jar 包中的檔案,鑑於現在很多應用都是透過 FatJar 方式部署,我們還需要找找其他方式。

透過InputStream物件讀取

File

物件不適合 jar 包中資源讀取的原因在於檔案路徑格式不一樣,所以我們可以直接將資源內容讀取為流的形式,這樣就沒有檔案路徑的問題了。比如:

springboot中,載入類路徑(classpath)中檔案內容的多種方法

讀取完畢。

文末總結

本文從載入資源、讀取內容兩個方法講解,給出了多種讀取方式。

《SpringBoot 實戰》是一個系列,我會透過實戰+原理的方式完整整個專欄,

有喜歡的小夥伴可以關注轉發一下,小編會持續為大家進行Java實戰內容分享!!!

Top