简介
本文介绍SpringBoot如何读写本地文件。
获得绝对路径
当前项目绝对路径
String path = System.getProperty(“user.dir”)
classes目录绝对路径
String path = ClassUtils.getDefaultClassLoader().getResource(“xxx”).getPath();
String path = ResourceUtils.getURL(“classpath:xxx”).getPath();
读取文件(无限制)
下边三种无论是IDE本地运行还是打成JAR包都可以读取到resource目录下的文件。(看源码可以发现:都是通过类加载器读取文件流)。
何为classpath
在Maven项目中,所有的resources文件都将被复制到classes目录下。classpath在tomcat项目中就是/classes,/lib和tomcat下的其他路径。
对于开发者来说,一般就是classes所在目录就是classpath路径的起点和base path。
方案1:使用类加载器
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("txt/test.txt");
方案2:基于ApplicationContext
简介
- 在获取了ApplicationContext实例之后,即可通过getResource方法获取resource对象
- 在获取resource对象之后,就可以通过resource一些方法读取文件内容。
- getFile:获取File对象。注意:此法不能获取jar包内部的文件
- getInputStream:获取输入流。此法可以获取jar包内部的文件
获取 ApplicationContext的方法:
import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component public class ApplicationContextHolder implements ApplicationContextAware { private static ApplicationContext context; public void setApplicationContext(ApplicationContext context) throws BeansException { ApplicationContextHolder.context = context; } public static ApplicationContext getContext() { return context; } }
使用fileSystem
Resource resource = ApplicationContextHolder.getContext().getResource("file:d:\test.txt"); // 也可以是相对路径 Resource resource = ApplicationContextHolder.getContext().getResource("file:log\test.txt");
使用url path
Resource resource = ApplicationContextHolder.getContext().getResource("url:http://www.test.com/testing.txt");
基于classpath
Resource resource = ApplicationContextHolder.getContext().getResource("classpath:txt/test.txt");
对应的文件放在了resources目录下:
方案3:基于ResourceLoader
在Spring中专门提供了一个ResourceLoader的接口来方便进行classpath的路径访问。
第一步:创建ResourceLoader对象
方式1:基于Aware方式注入ResourceLoader:
@Component public class MyBean implements ResourceLoaderAware { private ResourceLoader resourceLoader; public void setResourceLoader(ResourceLoader resourceLoader) { this.resourceLoader = resourceLoader; } public Resource getResource(String location){ return resourceLoader.getResource(location); } //....... }
方式2:直接基于@Bean的方式在Spring Boot中创建对应的实例,具体方式如下:
@Bean public ResourceLoader createResourceLoader() { return new DefaultResourceLoader(); }
第二步:获取ResourceLoader的对象后,将可以基于如下方式来获取配置信息:
方式1:
Resource resource = resourceLoader.getResource("classpath:txt/test.txt");
方式2:
String content = IOUtil.toString(resourceLoader.getResource("classpath:txt/test.txt").getInputStream());
IOUtil是Apache common项目中的IO类库包,可以通过以下方式来直接加入依赖:
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency>
读取文件(有限制)
File file = ResourceUtils.getFile("classpath:excleTemplate/test.xlsx"); InputStream inputStream = new FileInputStream(file);
上边使用java中File方式的读取,只有开发环境使用IDE时可以读取到,打到jar包时读取失败。
Resource详解
包的路径:org.springframework.core.io.Resource;
种类
// 文件系统资源。例如:D:... FileSystemResource // URL 资源。例如:file://... http://... UrlResource // 类路径下的资源。例如:classpth:... ClassPathResource // Web 容器上下文中的资源。例如:jar 包、war 包 ServletContextResource
方法
请先
!