本文摘要:四種讀取 Spring Boot 項目中 jar 包中的 resources 目錄下的文件
😎 作者介紹:我是程序員洲洲,一個熱愛寫作的非著名程序員。CSDN全棧優質領域創作者、華為云博客社區云享專家、阿里云博客社區專家博主。公粽號:洲與AI。
🤓 歡迎大家關注!我將分享Web前后端開發、人工智能、機器學習、深度學習從0到1系列文章。
🌼 同時洲洲已經建立了程序員技術交流群,如果您感興趣,可以私信我加入我的社群~社群中將不定時分享各類福利
🖥 隨時歡迎您跟我溝通,一起交流,一起成長、進步!點此即可獲得聯系方式~
本文目錄
- 前言
- 代碼一:getResourceAsStream()方法
- 代碼二: T.class..getResourceAsStream() 方法
- 代碼三:ClassPathResource 方法
- 代碼四:使用@Value注解注入
- 總結
前言
在SpringBoot應用中,經常需要讀取打包在jar包中的資源文件,比如配置文件、模板文件等。這些資源文件通常放在src/main/resources目錄下,在打包成jar包后,它們會被存儲在jar包的根目錄下。本文將介紹4種在SpringBoot中讀取這些資源文件的方法。
部署后,項目是通過打成 jar 包運行的,里面的文件是沒有實際路徑的(只有相對于項目名的相對路徑)。
代碼一:getResourceAsStream()方法
這是一個公共方法,用來讀取文件中的內容的方法,通過T.class.getClassLoader().getResourceAsStream() 方法。
比如要讀取 config 文件夾下的 test.properties 文件:
public static void printFileContent(Object obj) throws IOException {if (null == obj) {throw new RuntimeException("參數為空");}BufferedReader reader = null;// 如果是文件路徑if (obj instanceof String) {reader = new BufferedReader(new FileReader(new File((String) obj)));// 如果是文件輸入流} else if (obj instanceof InputStream) {reader = new BufferedReader(new InputStreamReader((InputStream) obj));}String line = null;while ((line = reader.readLine()) != null) {System.out.println(line);}reader.close();
}
此方法是從 classpath 路徑(即:src 或 resources 路徑下)下查找文件的,所以,路徑前不需要加 “/”。
讀取方法:
public class ResourceUtil {public void getResource(String fileName) throws IOException{InputStream in = this.getClass().getClassLoader().getResourceAsStream(fileName);printFileContent(in);}public static void main(String[] args) throws IOException {new ResourceUtil().getResource("config/test.properties");}
}
代碼二: T.class…getResourceAsStream() 方法
public void getResource2(String fileName) throws IOException{InputStream in = this.getClass().getResourceAsStream("/" + fileName);printFileContent(in);
}
public static void main(String[] args) throws IOException {new ResourceUtil().getResource2("config/test.properties");
}
本方法是從 classpath 路徑(即:src 或 resources 路徑下)下查找文件的,但它的路徑前需要加 “/” ,這個是跟讀取的文件與當前.class 文件的位置有關。
可以看看編譯后的文件路徑:
當前文件 ResourceUtil.class 與要加載的文件 test.properties 的位置如上: test.properties 和 ResourceUtil.class 不在同一個文件夾下,所以讀取的時候是要帶上相對路徑的,那么,這會有兩種情況:
-
如果 test.properties 和 ResourceUtil 在同一個文件夾下,那么:this.getClass().getResourceAsStream(“test.properties”)
-
如果 test.properties 和 ResourceUtil 不在同一個文件夾下,那么:this.getClass().getResourceAsStream(“/config/test.properties”)
代碼三:ClassPathResource 方法
public void getResource3(String fileName) throws IOException{ClassPathResource classPathResource = new ClassPathResource(fileName);printFileContent(classPathResource.getInputStream());
}
public static void main(String[] args) throws IOException {new ResourceUtil().getResource3("config/test.properties");
}
代碼四:使用@Value注解注入
SpringBoot提供了@Value注解,它可以用來注入配置文件中的值,包括從jar包中的資源文件中讀取。
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component
public class ConfigPropertiesReader {@Value("${app.config.value}")private String configValue;public void printConfigValue() {System.out.println("Config Value: " + configValue);}
}
在application.properties或application.yml文件中,可以這樣指定資源文件的位置:
app.config.value=classpath:config.properties
總結
Hello,各位看官老爺們好,洲洲已經建立了CSDN技術交流群,如果你很感興趣,可以私信我加入我的社群。
📝社群中不定時會有很多活動,例如每周都會包郵免費送一些技術書籍及精美禮品、學習資料分享、大廠面經分享、技術討論、行業大佬創業雜談等等。
📝社群方向很多,相關領域有Web全棧(前后端)、人工智能、機器學習、自媒體變現、前沿科技文章分享、論文精讀等等。
📝不管你是多新手的小白,都歡迎你加入社群中討論、聊天、分享,加速助力你成為下一個技術大佬!也隨時歡迎您跟我溝通,一起交流,一起成長。變現、進步、技術、資料、項目、你想要的這里都會有
📝歡迎您加入社群~一個人可以或許可以走的很快,但一群人將走的更遠!
📝關注我的公眾號(與CSDN同ID:洲與AI)可以獲得一份Java 10萬字面試寶典及相關資料!~
📝想都是問題,做都是答案!行動起來吧!歡迎評論區or后臺與我溝通交流,也歡迎您點擊下方的鏈接直接加入到我的交流社群!~ 跳轉鏈接社區~