Java如何獲取靜態(tài)資源文件路徑
Java獲取靜態(tài)資源文件路徑
? 開發(fā)中經(jīng)常會有文件相關的操作,比如說文件的查找,文件的存儲。
但是在使用中往往會因為路徑問題耽誤大量的開發(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方法實際調用就是ClassLoader的getResource方法,只不過在調用前對文件名進行了額外的處理,將“”轉為了包路徑,“/”轉為了“”。
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();
}總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
解決mysql字符串類型的數(shù)字排序出錯:cast(year as signed)
這篇文章主要介紹了解決mysql字符串類型的數(shù)字排序出錯問題 :cast(year as signed),如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
java連接mysql數(shù)據(jù)庫實現(xiàn)單條插入和批量插入
這篇文章主要為大家詳細介紹了java連接mysql數(shù)據(jù)庫實現(xiàn)單條插入和批量插入,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08

