Spring Boot 读取静态资源文件

一、需求场景

有时候我们需要在项目中使用一些静态资源文件,比如城市信息文件 countries.xml,在项目启动后读取其中的数据并初始化写进数据库中。

二、实现

静态资源文件 countries.xml 放在 src/main/resources 目录下

使用 Spring 的 ClassPathResource 来实现 :

Resource resource = new ClassPathResource("countries.xml");
File file = resource.getFile();
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
 
 
  • 1
  • 2
  • 3

ClassPathResource 类的注释如下:

Resource implementation for class path resources. Uses either a given ClassLoader or a given Class for loading resources.

Supports resolution as java.io.File if the class path resource resides in the file system, but not for resources in a JAR. Always supports resolution as URL.

翻译过来就是:

类路径资源的资源实现。使用给定的ClassLoader或给定的类来加载资源。

如果类路径资源驻留在文件系统中,则支持解析为 java.io.File,如果是JAR中的资源则不支持。始终支持解析为URL

三、Jar 中资源文件

上面也提到了,如果静态资源文件在文件系统里,则支持解析为 java.io.File,程序是能正常工作的。

到项目打包成 Jar 包放到服务器上运行就报找不到资源的错误了!

解决法案是:不获取 java.io.File 对象,而是直接获取输入流

Resource resource = new ClassPathResource("countries.xml");
BufferedReader br = new BufferedReader(new InputStreamReader(resource.getInputStream()));
 
 
  • 1
  • 2

说明:构造得到 resource 对象之后直接获取其输入流 resource.getInputStream()

---------------------------------------补充-----------------------------------------

resource.getFile() expects the resource itself to be available on the file system, i.e. it can't be nested inside a jar file. This is why it works when you run your application in STS but doesn't work once you've built your application and run it from the executable jar. Rather than using getFile() to access the resource's contents, I'd recommend using getInputStream() instead. That'll allow you to read the resource's content regardless of where it's located.

If you're using Spring framework then reading ClassPathResource into a String is pretty simple using Spring framework's FileCopyUtils:

String data = "";
ClassPathResource cpr = new ClassPathResource("static/file.txt");
try {
    byte[] bdata = FileCopyUtils.copyToByteArray(cpr.getInputStream());
    data = new String(bdata, StandardCharsets.UTF_8);
} catch (IOException e) {
    LOG.warn("IOException", e);
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot默认会将静态资源文件(如txt文件)放在classpath下的/static、/public和/resources目录中,可以直接访问。以下是几种读取txt静态文件的方法: 1. 使用ClasspathResourceLoader:在Spring Boot中,可以通过ClasspathResourceLoader类来读取classpath下的文件。可以通过以下代码来读取txt文件: ```java ClassLoader classLoader = getClass().getClassLoader(); Resource resource = new ClassPathResource("static/example.txt"); try { File file = resource.getFile(); // 读取文件内容 } catch (IOException e) { e.printStackTrace(); } ``` 2. 使用ResourceLoader:在Spring Boot中,可以通过ResourceLoader来加载classpath下的文件。可以通过以下代码来读取txt文件: ```java @Autowired private ResourceLoader resourceLoader; public void readTxtFile() { Resource resource = resourceLoader.getResource("classpath:static/example.txt"); try { InputStream inputStream = resource.getInputStream(); // 读取文件内容 inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } ``` 3. 使用文件路径:如果txt文件位于绝对路径下,可以直接使用File类来读取。可以通过以下代码来读取txt文件: ```java String filePath = "/absolute/path/to/example.txt"; File file = new File(filePath); try { BufferedReader reader = new BufferedReader(new FileReader(file)); String line; while ((line = reader.readLine()) != null) { // 读取文件内容 } reader.close(); } catch (IOException e) { e.printStackTrace(); } ``` 以上是使用Spring Boot读取txt静态文件的几种方法,根据具体情况选择合适的方法来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值