加载classpath下的文件资源
方式1: Class.getResourceAsStream(name)
指定要加载的资源路径与当前类所在包的路径一致, 如果这个name是以 '/'开头的,那么就会从classpath的根路径下开始查找
private void loadResource() {
try (InputStream inputStream = this.getClass().getResourceAsStream("/" + FILE_NAME);) {
String string = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
System.out.println(string);
} catch (IOException e) {
e.printStackTrace();
}
}
方式2: ClassLoader.getResourceAsStream(name)
指定要加载的资源路径在classpath根路径下的相对路径
private void loadResource() {
try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(FILE_NAME);) {
String string = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
System.out.println(string);
} catch (IOException e) {
e.printStackTrace();
}
}
方式3: 如果使用Spring框架,可以使用ClassPathResource来获取文件资源
指定要加载的资源路径在classpath根路径下的相对路径
private void loadResource() {
try (InputStream inputStream = new ClassPathResource(FILE_NAME).getInputStream();) {
String string = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
System.out.println(string);
} catch (IOException e) {
e.printStackTrace();
}
}
这种方式其实就是一个上面两种方式的聚合,看下ClassPathResource#getInputStream()
publicClassPathResource(String path) {
this(path, (ClassLoader) null);
}
public ClassPathResource(String path, @Nullable ClassLoader classLoader) {
Assert.notNull(path, "Path must not be null");
String pathToUse = StringUtils.cleanPath(path);
if (pathToUse.startsWith("/")) {
pathToUse = pathToUse.substring(1);
}
this.path = pathToUse;
this.classLoader = (classLoader != null ? classLoader : ClassUtils.getDefaultClassLoader());
}
@Override
public InputStream getInputStream() throws IOException {
InputStream is;
if (this.clazz != null) {
is = this.clazz.getResourceAsStream(this.path);
}
else if (this.classLoader != null) {
is = this.classLoader.getResourceAsStream(this.path);
}
else {
is = ClassLoader.getSystemResourceAsStream(this.path);
}
if (is == null) {
throw new FileNotFoundException(getDescription() + " cannot be opened because it does not exist");
}
return is;
}