java getresourceasstream null_java踩坑记-getResourceAsStream
本文主要是研究下面集中方法到底誰才能真正的load到文件,你能一眼看出來嗎?
GetResourcesSample.class.getClassLoader.getResourceAsStream("main-resources-file.txt")
GetResourcesSample.class.getClass().getResourceAsStream("main-resources-file.txt")
GetResourcesSample.class.getResourceAsStream("main-resources-file.txt")
GetResourcesSample.class.getClassLoader.getResourceAsStream("/main-resources-file.txt")
GetResourcesSample.class.getClass().getResourceAsStream("/main-resources-file.txt")
GetResourcesSample.class.getResourceAsStream("/main-resources-file.txt")
很暈吧,反正我是挺暈的。
目錄結(jié)構(gòu):
代碼:
public classGetResourcesSample {private static final String MAIN_FILE = "main-resources-file.txt";private static final String MAIN_FILE_WITH_SLASH = "/main-resources-file.txt";private static final String TEST_FILE = "test-resources-file.txt";private static final String TEST_FILE_WITH_SLASH = "/test-resources-file.txt";private static final String ROOT_FILE = "project-root-file.txt";private static final String ROOT_FILE_WITH_SLASH = "./project-root-file.txt";public static voidmain(String[] args) {
validateResult(MAIN_FILE);
validateResult(MAIN_FILE_WITH_SLASH);
validateResult(TEST_FILE);
validateResult(TEST_FILE_WITH_SLASH);
validateResult(ROOT_FILE);
validateResult(ROOT_FILE_WITH_SLASH);
}private static voidvalidateResult(String file) {
InputStream inputStream1= GetResourcesSample.class.getClass().getResourceAsStream(file);if (inputStream1 != null) {
System.out.println(MessageFormat
.format("GetResourcesSample.class.getClass().getResourceAsStream(\"{0}\") is not null!", file));
}
InputStream inputStream2= GetResourcesSample.class.getResourceAsStream(file);if (inputStream2 != null) {
System.out.println(
MessageFormat.format("GetResourcesSample.class.getResourceAsStream(\"{0}\") is not null!", file));
}
InputStream inputStream3= GetResourcesSample.class.getClassLoader().getResourceAsStream(file);if (inputStream3 != null) {
System.out.println(
MessageFormat.format("GetResourcesSample.class.getClassLoader().getResourceAsStream(\"{0}\") is not null!", file));
}
}
}
結(jié)果:
GetResourcesSample.class.getClassLoader().getResourceAsStream("main-resources-file.txt") is not null!
GetResourcesSample.class.getClass().getResourceAsStream("/main-resources-file.txt") is not null!
GetResourcesSample.class.getResourceAsStream("/main-resources-file.txt") is not null!
結(jié)論:
Class.getResourceAsStream 最終調(diào)用的是此Class的Class Loader的getResourceAsStream來進(jìn)行讀文件(有些繞,盡量理解)
GetResourcesSample.class.getClass() 得到的是Class這個(gè)類的實(shí)例,它的ClassLoader是JVM的bootstrap Class Loader
GetResourcesSample.class.getResourceAsStream 由于去resolve了一下name,雖然是當(dāng)前class的ClassLoader,它也讀不到這個(gè)文件;除非你的文件名以“/”開頭。詳見源代碼:
/*** Add a package name prefix if the name is not absolute Remove leading "/"
* if name is absolute*/
privateString resolveName(String name) {if (name == null) {returnname;
}if (!name.startsWith("/")) {
Class> c = this;while(c.isArray()) {
c=c.getComponentType();
}
String baseName=c.getName();int index = baseName.lastIndexOf('.');if (index != -1) {
name= baseName.substring(0, index).replace('.', '/')+"/"+name;
}
}else{
name= name.substring(1);
}returnname;
}
project-root-file.txt這種最后最終不被打在Jar包里的文件,是沒有機(jī)會(huì)被讀取的,除非hard code一個(gè)文件所在的絕對(duì)路徑
把相同代碼放到UT里面去跑,會(huì)發(fā)現(xiàn)UT能同時(shí)load到main和test下的文件。因?yàn)镴Unit有它自己的ClassLoader,它能同時(shí)讀到main和test下的文件。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的java getresourceasstream null_java踩坑记-getResourceAsStream的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java注解库_Java 注解详解
- 下一篇: java 自定义validate_Gol