Java如何獲取靜態(tài)資源文件路徑
Java獲取靜態(tài)資源文件路徑
? 開發(fā)中經(jīng)常會有文件相關(guān)的操作,比如說文件的查找,文件的存儲。
但是在使用中往往會因為路徑問題耽誤大量的開發(fā)時間。
在實際中常常通過File file = new File(“c://a.txt”)方式來使用,但是切換環(huán)境后可能會遇到找不到該資源的問題。
Java中,可以使用getResource()方法來獲取資源。
項目工程如下:
1.Class和ClassLoader對于getResouce()的區(qū)別?
public class ResourceTest { @Test public void test1() { // /Users/luojiacheng/code/translaction-test/target/test-classes/com/ljc/ System.out.println(ResourceTest.class.getResource("").getPath()); // /Users/luojiacheng/code/translaction-test/target/test-classes/ System.out.println(ResourceTest.class.getResource("/").getPath()); // /Users/luojiacheng/code/translaction-test/target/test-classes/ System.out.println(ResourceTest.class.getClassLoader().getResource("").getPath()); // null System.out.println(ResourceTest.class.getClassLoader().getResource("/")); } }
Class:
getResource("")
獲取的是當前文件的路徑;getResouce("/")
獲取的是classes下的路徑,在spring中相當于/WEB-INF/classes/下;
ClassLoader:
getResource("")
獲取的是classes下的路徑,等同于Class.getResource("/");getResouce("/")
無法獲取。
2.getResourceAsStream()
public InputStream getResourceAsStream(String name) { URL url = getResource(name); try { return url != null ? url.openStream() : null; } catch (IOException e) { return null; } }
getResourceAsStream()其實就是在getReource() + new InputStream()。
3.Class.getResource()實現(xiàn)
public java.net.URL getResource(String name) { // 獲取包路徑 name = resolveName(name); ClassLoader cl = getClassLoader0(); if (cl==null) { // A system class. return ClassLoader.getSystemResource(name); } // "" -> com/.../ "/" -> "" return cl.getResource(name); }
Class的getResouce方法實際調(diào)用就是ClassLoader的getResource方法,只不過在調(diào)用前對文件名進行了額外的處理,將“”轉(zhuǎn)為了包路徑,“/”轉(zhuǎn)為了“”。
4.示例
/** * 無內(nèi)容返回 */ @GetMapping("/getTextFromFile") public String getTextFromFile() throws IOException { String filePath = MyFileOperation.class.getResource("/a.txt").getPath(); // **.jar!/BOOT-INF/classes!/a.txt System.out.println(filePath); File file = new File(filePath); StringBuilder s = new StringBuilder(); if (file.exists()) { InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "gbk"); BufferedReader bufferedReader = new BufferedReader(isr); String str; while ((str = bufferedReader.readLine()) != null) { s.append(str); } } return s.toString(); } /** * 正確 */ @GetMapping("/getTextFromFileByStream") public String getTextFromFileByStream() throws IOException { StringBuilder s = new StringBuilder(); InputStreamReader isr = new InputStreamReader( MyFileOperation.class.getResourceAsStream("/a.txt"), "gbk"); BufferedReader bufferedReader = new BufferedReader(isr); String str; while ((str = bufferedReader.readLine()) != null) { s.append(str); } return s.toString(); }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java面向?qū)ο蟪绦蛟O(shè)計:繼承,多態(tài)用法實例分析
這篇文章主要介紹了Java面向?qū)ο蟪绦蛟O(shè)計:繼承,多態(tài)用法,結(jié)合實例形式分析了java繼承與多態(tài)的相關(guān)概念、原理、實現(xiàn)方法與操作注意事項,需要的朋友可以參考下2020-04-04jdk17?SpringBoot?JPA集成多數(shù)據(jù)庫的示例詳解
這篇文章主要介紹了jdk17?SpringBoot?JPA集成多數(shù)據(jù)庫的示例代碼,包括配置類、請求攔截器、線程上下文等相關(guān)知識,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08Windows系統(tǒng)下Eclipse搭建ESP32編譯環(huán)境及安裝過程
Ecppse 使用了 ESP-IDF 中的 Makefile 支持。這意味著您需要從創(chuàng)建 ESP-IDF 項目開始。您可以使用 github 中的 idf-template 項目,接下來通過本文給大家介紹Windows系統(tǒng)下Eclipse搭建ESP32編譯環(huán)境及安裝過程,感興趣的朋友一起看看吧2021-10-10Java輕量級權(quán)限認證框架Sa-Token的使用
Sa-Token是一個輕量級Java權(quán)限認證框架,本文就詳細的來介紹一下Java輕量級權(quán)限認證框架Sa-Token的使用,主要解決:登錄認證、權(quán)限認證、Session會話、單點登錄、OAuth2.0、微服務網(wǎng)關(guān)鑒權(quán)等,感興趣的可以了解一下2022-03-03java基于jedisLock—redis分布式鎖實現(xiàn)示例代碼
這篇文章主要介紹了jedisLock—redis分布式鎖實現(xiàn)示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11