Java中有多种加载资源的方式:
this.getClass().getResource(resourceName)
除非以”/“开头,否则找this类同包的文件。
Thread.currentThread().getContextClassLoader().getResource(resourceName)
ClassLoader可以共享,创建的线程使用Thread.setContextClassLoader,可以相互加载对象的资源。
如果没有设置则是其父线程的类加载器。
ClassLoader.getSystemClassLoader().getResource(resourceName)
需要使用root开始的完整路径
代码示例
项目结构:
package com.logicbig.example;
import java.io.IOException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
public class ClassA {
private static final String line = "-----------------------------------------";
private void loadResource (String resource) throws IOException {
URL u = this.getClass().getResource(resource);
loadResourceByUrl(u, resource);
}
private void loadResourceWithContextLoader (String resource) throws IOException {
URL u = Thread.currentThread().getContextClassLoader().getResource(resource);
loadResourceByUrl(u, resource);
}
private void loadResourceWithSystemClassLoader (String resource) throws IOException {
URL u = ClassLoader.getSystemClassLoader().getResource(resource);
loadResourceByUrl(u, resource);
}
private void loadResourceByUrl (URL u, String resource) throws IOException {
System.out.println("-> attempting input resource: "+resource);
if (u != null) {
String path = u.getPath();
path = path.replaceFirst("^/(.:/)", "$1");
System.out.println(" absolute resource path found :n " + path);
String s = new Stri