mysterin / question_and_answer

1 stars 0 forks source link

Java 加载资源 #130

Closed mysterin closed 5 years ago

mysterin commented 5 years ago

URL ClassLoader.getResource(String name)

在 classpath 目录下找 name 的文件返回对应 URL.

InputStream ClassLoader.getResourceAsStream(String name)

在 classpath 目录下找 name 的文件返回 InputStream.

URL Class.getResource(String name)

name 如果是/开头, 把/去掉然后调用ClassLoader.getResource(String name). name 如果不是/开头, 增加当前 Class 对应的包目录, 然后调用ClassLoader.getResource(String name).

InputStream Class.getResourceAsStream(String name)

name 如果是/开头, 把/去掉然后调用ClassLoader.getResourceAsStream(String name). name 如果不是/开头, 增加当前 Class 对应的包目录, 然后调用`ClassLoader.getResourceAsStream(String name).

需要注意: name 必须是/分割的目录路径, 而不能是.分割的包路径

下面是 Class 类中去掉/以及增加当前 Class 对应包目录的方法, 假设 name 是: /aa/bb/cc.properties, 那么需要转成: aa/bb/cc.properties; 如果 name 是: cc.properties, 那么需要转成: aa/bb/cc.properties.

private String resolveName(String name) {
    if (!name.startsWith("/")) {
        Class<?> c = this;
        while (c.isArray()) {
            c = c.getComponentType();
        }
        String baseName = c.getPackageName();
        if (baseName != null && !baseName.isEmpty()) {
            name = baseName.replace('.', '/') + "/" + name;
        }
    } else {
        name = name.substring(1);
    }
    return name;
}