共计 2314 个字符,预计需要花费 6 分钟才能阅读完成。
本文聊一聊在 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"));
}