方式一: this.getClass().getClassLoader().getResourceAsStream(String name) 首先調用對象的getClass()方法是獲得對象當前的類類型,這部分數據存在方法區,而後在類類型上調用getClassLoader()方法是得到當前類型的類加 ...
方式一: this.getClass().getClassLoader().getResourceAsStream(String name)
首先調用對象的getClass()方法是獲得對象當前的類類型,這部分數據存在方法區,而後在類類型上調用getClassLoader()方法是得到當前類型的類載入器,我們知道在Java中所有的類都是通過載入器載入到虛擬機中的,而且類載入器之間存在父子關係,就是子知道父,父不知道子,這樣不同的子載入的類型之間是無法訪問的(雖然它們都被放在方法區中),所以在這裡通過當前類的載入器來載入資源也就是保證是和類類型同一個載入器載入的。最後調用類載入器的getResourceAsStream()方法來載入資源。
這裡的 name 不能帶“/”,否則會拋空指針
方式二: this.class.getResourceAsStream(String name)
若name不以“/”開頭時,預設是從此類所在的包下取資源;以“/”開頭時,則是從classpath根下獲取。
示例
如果maven項目打成 jar包不要使用 xxx.calss.getResource(path)或 xxx.calss.getClassLoader().getResource(path) 獲取相應的資源文件,會報錯。儘量使用stream流的方式操作資源文件
擴展: spring中classpath的理解
maven項目編譯後,java文件會被編譯成class文件放在classes文件夾下;resource下的資源文件也會被放到classes文件夾下。
本文部分轉自:https://www.cnblogs.com/yadongliang/p/7920053.html