本文聊一聊在 SpringBoot 利用中,拜访加载类门路(classpath)中的文件内容的多种办法。

通过Resource接口
Resource接口形象出一种更底层的形式治理资源,能够实现通过对立的形式解决各类文件资源。上面是几种获取资源实例的办法。

手动加载
拜访类门路中的文件,咱们能够间接应用ClassPathResource加载内容,比方:

new ClassPathResource("data/resource-data.txt");

默认状况下,ClassPathResource会在线程的上下文类加载器和默认零碎类加载器之间进行抉择,以删除样板文件。咱们也能够间接指定类加载器,比方:

new ClassPathResource("data/resource-data.txt", this.getClass().getClassLoader());

或者是通过指定类的类加载器:

new ClassPathResource("data/resource-data.txt", Employee.class.getClassLoader());

从Resource对象,咱们能够很容易的将其转换为InputStream或File对象。

下面说的形式都是绝对于类门路的地址。如果想要指定某个类的相对路径,咱们和能够通过指定具体类来定义,比方:

new ClassPathResource("../../../data/resource-data.txt", Example.class).getFile();
1
这样就是绝对于Example的相对路径了。在理论应用中,不太倡议通过类获取其相对路径的文件。这样会将类与文件的绝对坐标绑定,如果批改了类的包门路,然而遗记批改文件地位,就会呈现谬误。而且,大家当初个别是应用 Maven 之类的包管理器治理,能够间接在resources目录中定义配置文件,应用类门路的绝对地址加载文件即可。

通过@Value主动转换
咱们还能够应用@Value间接注入Resource对象,比方:

@Value("classpath:data/resource-data.txt")
Resource resourceFile;

@Value还能反对其余的加载协定,比方file:或url:。

通过ResourceLoader加载
咱们还能应用注入ResourceLoader来实现资源的懒加载,比方,先注入ResourceLoader实例:

@Autowired
ResourceLoader resourceLoader;

而后在咱们须要的中央,通过ResourceLoader实例加载资源:

resourceLoader.getResource("classpath:data/resource-data.txt");
1
在 Spring 中,ApplicationContext实现了ResourceLoader,所以,咱们也能够间接通过ApplicationContext实例加载资源,比方:

ApplicationContext context;

public Resource loadEmployeesWithApplicationContext() {

return context.getResource("classpath:data/resource-data.txt");

}

应用ResourceUtils加载资源
在 Spring 外部,还提供了一个工具类ResourceUtils,能够很不便的获取类门路中额资源。然而通过这个类的 Javadoc 能够看到,这个类次要是在 Spring 外部应用,也就是说,不太举荐这种用法。不过咱们能够理解一下:

public File loadEmployeesWithSpringInternalClass()
throws FileNotFoundException {

return ResourceUtils.getFile(  "classpath:data/resource-data.txt");

}

咱们能够理解其外部实现,然而还是倡议应用其余更加规范的做法。

读取资源中的内容
下面都是通过各种形式获取了Resource资源,接下来咱们就聊聊如果获取资源对象的数据。

比方,咱们的资源文件内容如下:

通过File对象读取
咱们能够应用getFile办法失去File实例,就能够用读取File对象的形式读取文件了,比方:

@Test
File resource = new ClassPathResource("data/resource-data.txt").getFile();
String content = new String(Files.readAllBytes(resource.toPath()));

然而这种形式不实用与读取 jar 包中的文件,鉴于当初很多利用都是通过 FatJar 形式部署,咱们还须要找找其余形式。java培训

通过InputStream对象读取
File对象不适宜 jar 包中资源读取的起因在于文件门路格局不一样,所以咱们能够间接将资源内容读取为流的模式,这样就没有文件门路的问题了。比方:

InputStream resource = new ClassPathResource("data/resource-data.txt").getInputStream();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource))) {

String content = reader.lines().collect(Collectors.joining("\n"));

}