Java 如何正确地从资源文件夹中获取文件
许多从资源文件夹读取文件的教程都使用类加载器。但是,使用该方法,我无法克服静态警告的问题,结果总是空指针异常Java 如何正确地从资源文件夹中获取文件,java,resources,classloader,Java,Resources,Classloader,许多从资源文件夹读取文件的教程都使用类加载器。但是,使用该方法,我无法克服静态警告的问题,结果总是空指针异常 public class Test { public static void main(String[] args) { StringBuilder contentBuilder=new StringBuilder(); ClassLoader classLoader=Test.class.getClassLoader(); Fil
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。或者您可以尝试一次阅读所有内容:
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,请记住根据您的案例设置资源(作为源根
或测试源根
)
顺便说一句,使用
Test.class.getClassLoader()可以解决问题代码> Test.class.getClassLoader()
从类
方法公共类加载器getClassLoader()
获取对类加载器
的引用-请参阅下面的私有最终类加载器类加载器
由于您是从该类的对象访问ClassLoader
类,因此您不是以静态方式访问它
来自Class.java
,java SE 1.7:
为了以静态方式访问该方法,必须从声明该方法为静态的类中调用该方法,如果要消除警告:
ClassLoader.getSystemResource("test.html").getFile()
要避免NPE,test.html
文件应位于源文件夹下
要响应您的评论,请使用返回的方法而不是解决问题的方法-请参阅
您正在使用maven吗?ClassLoader.getSystemResource(“test.html”).getFile()
谢谢您的回复。我正在使用Maven,但这有关系吗?您的建议消除了警告,但我仍然得到空指针异常。如果它找不到文件,无论出于什么原因,我不是会得到一个文件未找到异常吗?这是否意味着“ClassLoader.getSystemResource”有问题?为什么这是一个糟糕的问题?我在对Shantu的评论中问到,如果文件路径错误,我会得到一个未找到文件的异常,而不是空指针。假设你说路径是错误的,我的路径是Test->src->resources->help.html。那么文件路径会是“resources/test.html”吗?我尝试了路径“resources/test.html”,然后得到了文件未找到异常。这是非常混乱的,因为现在我不知道空指针异常是从哪里来的。有趣的是,如果我按照回溯中的路径,文件确实在那里。@Wt Riker我已经添加了一些提示:希望它会有帮助谢谢但没有乐趣。我认为底线是这个问题与目录结构和查找目标文件有关。我被难住了。我尝试了“/test.html”、“test.html”、“resources/test.html”、“src/resources/test.html”,但它们都出现了相同的异常。包括Hearen的建议。@Wt Riker我测试了上面的解决方案,它可以在Eclipse中工作,也可以在带有src
或resources
中文件的jar中工作。无论如何祝你好运仔细检查文件名:help.html或test.html?;-)
ClassLoader.getSystemResource("test.html").getFile()
public class Test {
public static void main(String[] args) {
StringBuilder contentBuilder = new StringBuilder();
InputStream is = Test.class.getResourceAsStream("/test.html");
try {
String sCurrentLine;
BufferedReader buffer = new BufferedReader(new InputStreamReader(is));
while ((sCurrentLine = buffer.readLine())!=null)
contentBuilder.append(sCurrentLine);
buffer.close();
} catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
System.out.println("content=" + contentBuilder.toString());
}
}