许多用于从资源文件夹读取文件的教程都使用类加载器。但是,使用该方法无法解决静态警告问题,并且结果始终是空指针异常。
public class Test {
public static void main(String[] args) {
StringBuilder contentBuilder=new StringBuilder();
ClassLoader classLoader=Test.class.getClassLoader();
File file=new File(classLoader.getSystemResource("test.html").getFile());
try {
BufferedReader buffer=new BufferedReader(new FileReader(file));
String sCurrentLine="";
while ((sCurrentLine=buffer.readLine())!=null) {
contentBuilder.append(sCurrentLine);
}
buffer.close();
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
String content=contentBuilder.toString();
System.out.println("content="+content);
}
}
我的IDE在“文件”行上的警告是:
应该以静态方式访问ClassLoader类型的静态方法getSystemResource(String)
我无法弄清楚如何消除该警告,如果我忽略它并运行代码,则会得到空指针异常。为什么会得到这个,如何解决? TIA。
答案 0 :(得分:1)
SELECT p.productid, p.dupproductid
FROM (SELECT p.productid
,p.dupproductid
,ROW_NUMBER() OVER(PARTITION BY dupproductid ORDER BY productid DESC) as RN
FROM products p, categories c
WHERE c.catid = p.catid && (c.parent IN(2257) || p.catid = 2257)
) T
WHERE T.productid = 0
OR RN = 1
从Test.class.getClassLoader();
'方法ClassLoader
获得对Class
类的引用-请参见下面的public ClassLoader getClassLoader()
。
由于您正在从该类的对象访问private final ClassLoader classLoader
类,因此您并不是以静态方式访问它。
来自ClassLoader
的 Java SE 1.7 :
Class.java
为了以静态方式访问该方法,如果您想摆脱警告,则必须从将其声明为静态的类中调用该方法:
@CallerSensitive
public ClassLoader getClassLoader() {
ClassLoader cl = getClassLoader0();
if (cl == null)
return null;
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
ClassLoader.checkClassLoaderPermission(cl, Reflection.getCallerClass());
}
return cl;
}
// Package-private to allow ClassLoader access
ClassLoader getClassLoader0() { return classLoader; }
// Initialized in JVM not by private constructor
// This field is filtered from reflection access, i.e. getDeclaredField
// will throw NoSuchFieldException
private final ClassLoader classLoader;
为避免NPE,ClassLoader.getSystemResource("test.html").getFile()
文件应位于源文件夹下。
要回复您的评论,请使用返回非URL
的方法来解决您的问题-请参见Reading a resource file from within jar。
test.html
答案 1 :(得分:0)
或者您可以尝试一次阅读所有内容:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
String content;
try {
content = new String(Files.readAllBytes(Paths.get(loader.getResource("test.html").toURI())), StandardCharsets.UTF_8);
} catch (Exception e) {
e.printStackTrace();
}
如果您使用的是 maven ,请记住要根据您的情况设置资源(为Sources Root
或Test Sources Root
)。
顺便说一句,使用Test.class.getClassLoader();
可以解决您的问题。