SpringBoot--读写本地文件

原文网址:SpringBoot--读写本地文件_IT利刃出鞘的博客-CSDN博客

简介

本文介绍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

简介

  1. 在获取了ApplicationContext实例之后,即可通过getResource方法获取resource对象
  2. 在获取resource对象之后,就可以通过resource一些方法读取文件内容。
    1. getFile:获取File对象。注意:此法不能获取jar包内部的文件
    2. 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类库包,可以通过以下方式来直接加入依赖:

commons-iocommons-io2.6

读取文件(有限制)

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

方法


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部