如何从资源文件夹中正确获取文件

时间:2018-07-04 14:45:10

标签: java resources classloader

许多用于从资源文件夹读取文件的教程都使用类加载器。但是,使用该方法无法解决静态警告问题,并且结果始终是空指针异常。

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。

2 个答案:

答案 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 RootTest Sources Root)。

顺便说一句,使用Test.class.getClassLoader();可以解决您的问题。