mysterin / question_and_answer

1 stars 0 forks source link

ClassLoader.getResourceAsStream 和 Class.getResourceAsStream 区别 #121

Closed mysterin closed 5 years ago

mysterin commented 5 years ago

ClassLoader.getResourceAsStream() 读取类路径下的文件, 要注意文件路径不是用 / 开头 Class.getResourceAsStream() 同样是读取类路径下的文件, 如果是 / 开头, 那么就去 classpath 的根路径下读文件; 如果不是 / 开头, 那么就回去类所在目录读取文件. 实际是通过调用 ClassLoader.getResourceAsStream() 来完成文件读取的. 可以参考下面 Class 的路径规则:

private String resolveName(String name) {
    if (name == null) {
        return name;
    }
    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);
    }
    return name;
}