本文讲述了在SpringBoot应用中访问加载类路径(classpath)中文件内容的各种方法。通过Resource接口,Resource接口抽象出一种更底层的资源管理方式,可以统一处理各种文件资源。下面介绍几种获取资源实例的方法。手动加载和访问类路径下的文件,我们可以直接使用ClassPathResource加载内容,如:newClassPathResource("data/resource-data.txt");默认情况下,ClassPathResource会在线程的上下文类加载器和默认系统类加载器之间进行选择,以移除样板文件。我们也可以直接指定类加载器,如:newClassPathResource("data/resource-data.txt",this.getClass().getClassLoader());或者通过指定类加载器:newClassPathResource("data/resource-data.txt",Employee.class.getClassLoader());从Resource对象,我们可以轻松地将其转换为InputStream或File对象。上面提到的方法都是相对于类路径的地址。如果我们要指定某个类的相对路径,可以通过指定具体的类来定义,如:newClassPathResource("../../../data/resource-data.txt",Example.班级)。getFile();1这是相对于Example的相对路径。实际使用中,不建议通过类获取相对路径的文件。这会将类绑定到文件的相对坐标。如果修改了类的包路径而忘记修改文件位置,就会报错。而且大家现在一般都是使用Maven之类的包管理器来管理。可以直接在resources目录下定义配置文件,使用类路径的相对地址加载文件。通过@Value自动转换,我们也可以使用@Value直接注入Resource对象,如:@Value("classpath:data/resource-data.txt")ResourceresourceFile;@Value还可以支持其他加载协议,例如file:或url:。通过ResourceLoader加载我们也可以通过ResourceLoader的注入来实现资源的懒加载,比如先注入ResourceLoader实例:@AutowiredResourceLoaderresourceLoader;然后在我们需要的地方,通过ResourceLoader实例加载资源:resourceLoader.getResource("classpath:data/resource-data.txt");1在Spring中,ApplicationContext实现了ResourceLoader,所以我们也可以直接通过ApplicationContext实例加载资源,如:ApplicationContext上下文;publicResourceloadEmployeesWithApplicationContext(){returncontext.getResource("classpath:data/resource-data.txt");}使用ResourceUtils加载资源Spring内部也提供了一个工具类ResourceUtils,可以方便的获取类路径下的资源.但是从这个类的Javadoc可以看出,这个类主要是在Spring内部使用,也就是说不推荐这种用法。但是我们可以看一下:publicFileloadEmployeesWithSpringInternalClass()throwsFileNotFoundException{returnResourceUtils.getFile("classpath:data/resource-data.txt");}我们可以了解它的内部实现,但是建议使用其他更标准的做法。阅读资源中的内容。Resource资源的获取方式多种多样。接下来说说如何获取资源对象的数据。比如我们的资源文件的内容是这样的:通过读取File对象,我们可以使用getFile方法获取File实例,然后通过读取File对象来读取文件,例如:@TestFileresource=newClassPathResource("data/resource-data.txt").getFile();Stringcontent=newString(Files.readAllBytes(resource.toPath()));但是这种方式不适合读取jar包中的文件,因为现在很多应用都需要通过FatJar寻找其他方式部署。Java训练通过InputStream对象读取File对象之所以不适合jar包中的资源读取是因为文件路径格式不一样,所以我们可以直接把资源内容当成流来读取,所以文件路径是没有问题的.例如:InputStreamresource=newClassPathResource("data/resource-data.txt").getInputStream();try(BufferedReaderreader=newBufferedReader(newInputStreamReader(resource))){Stringcontent=reader.lines().collect(Collectors.joining("\n"));}
