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());
    }
}