在Spring Boot中从类路径加载文件的示例

 更新时间:2020年10月12日 09:24:30   作者:程序汪布丁  
创建Spring Boot Web应用程序时,有时有时需要从类路径中加载文件;war和jar的加载文件格式是不一样的,在下面,您将找到在WAR和JAR中加载文件的解决方案。

资源加载器

使用Java,您可以使用当前线程的classLoader并尝试加载文件,但是Spring Framework为您提供了更为优雅的解决方案,例如ResourceLoader。

您只需要自动连接ResourceLoader,然后调用getResource(„somePath“)方法即可。

在Spring Boot(WAR)中从资源目录/类路径加载文件的示例

在以下示例中,我们从类路径中加载名为GeoLite2-Country.mmdb的文件作为资源,然后将其作为File对象检索。

@Service("geolocationservice") 
public class GeoLocationServiceImpl implements GeoLocationService { 
 private static final Logger LOGGER = LoggerFactory.getLogger(GeoLocationServiceImpl.class); 
 private static DatabaseReader reader = null; 
 private ResourceLoader resourceLoader; 
 @Autowired 
 public GeoLocationServiceImpl(ResourceLoader resourceLoader) { 
  this.resourceLoader = resourceLoader; 
 } @PostConstruct 
 public void init() { 
  try { 
   LOGGER.info("GeoLocationServiceImpl: Trying to load GeoLite2-Country database..."); 
   Resource resource = resourceLoader.getResource("classpath:GeoLite2-Country.mmdb"); 
   File dbAsFile = resource.getFile();   // Initialize the reader 
   reader = new DatabaseReader 
      .Builder(dbAsFile) 
      .fileMode(Reader.FileMode.MEMORY) 
      .build(); 
   LOGGER.info("GeoLocationServiceImpl: Database was loaded successfully."); 
  } catch (IOException | NullPointerException e) { 
   LOGGER.error("Database reader cound not be initialized. ", e); 
  } 
 } 
 @PreDestroy 
 public void preDestroy() { 
  if (reader != null) { 
   try { 
    reader.close(); 
   } catch (IOException e) { 
    LOGGER.error("Failed to close the reader."); 
   } 
  } 
 } 
} 

在Spring Boot(JAR)中从资源目录/类路径加载文件的示例

如果您想从Spring Boot JAR中的 classpath加载文件,则必须使用该resource.getInputStream()方法将其作为InputStream检索。如果尝试使用resource.getFile()该方法,则会收到错误消息,因为Spring尝试访问文件系统路径,但无法访问JAR中的路径。

@Service("geolocationservice") 
public class GeoLocationServiceImpl implements GeoLocationService { 
 private static final Logger LOGGER = LoggerFactory.getLogger(GeoLocationServiceImpl.class); 
 private static DatabaseReader reader = null; 
 private ResourceLoader resourceLoader; 
 @Inject 
 public GeoLocationServiceImpl(ResourceLoader resourceLoader) { 
  this.resourceLoader = resourceLoader; 
 } @PostConstruct 
 public void init() { 
  try { 
   LOGGER.info("GeoLocationServiceImpl: Trying to load GeoLite2-Country database..."); 
   Resource resource = resourceLoader.getResource("classpath:GeoLite2-Country.mmdb"); 
   InputStream dbAsStream = resource.getInputStream(); // <-- this is the difference 
   // Initialize the reader 
   reader = new DatabaseReader 
      .Builder(dbAsStream) 
      .fileMode(Reader.FileMode.MEMORY) 
      .build(); 
   LOGGER.info("GeoLocationServiceImpl: Database was loaded successfully."); 
  } catch (IOException | NullPointerException e) { 
   LOGGER.error("Database reader cound not be initialized. ", e); 
  } 
 } 
 @PreDestroy 
 public void preDestroy() { 
  if (reader != null) { 
   try { 
    reader.close(); 
   } catch (IOException e) { 
    LOGGER.error("Failed to close the reader."); 
   } 
  } 
 } 
} 

以上就是在Spring Boot中从类路径加载文件的示例的详细内容,更多关于spring boot 加载文件的资料请关注脚本之家其它相关文章!

相关文章

  • Spring MVC DispatcherServlet处理请求过程示例详解

    Spring MVC DispatcherServlet处理请求过程示例详解

    这篇文章主要介绍了Spring MVC DispatcherServlet处理请求过程示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 通过Java实现中文分词与文本关键词提取

    通过Java实现中文分词与文本关键词提取

    这篇文章主要为大家详细介绍了如何利用Java实现中文分词以及文本关键词提取功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习学习
    2023-06-06
  • Java之SpringCloudAlibaba Sentinel组件案例讲解

    Java之SpringCloudAlibaba Sentinel组件案例讲解

    这篇文章主要介绍了Java之SpringCloudAlibaba Sentinel组件案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • java中volatile不能保证线程安全(实例讲解)

    java中volatile不能保证线程安全(实例讲解)

    下面小编就为大家带来一篇java中volatile不能保证线程安全(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Spring事务的七种传播行为

    Spring事务的七种传播行为

    这篇文章主要介绍了Spring事务的七种传播行为,文章围绕主题的相关资料展开详细的内容解说,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • 解析Mybatis连续传递多个参数的方法

    解析Mybatis连续传递多个参数的方法

    MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架,这篇文章主要介绍了Mybatis连续传递多个参数的方法,需要的朋友可以参考下
    2016-08-08
  • Java注解之Elasticsearch的案例详解

    Java注解之Elasticsearch的案例详解

    学会了技术就要使用,否则很容易忘记,因为自然界压根就不存在什么代码、变量之类的玩意,这都是一些和生活常识格格不入的东西。这篇文章主要介绍了Java中Elasticsearch的案例,感兴趣的可以了解一下
    2022-10-10
  • Java实现获取银行卡所属银行,验证银行卡号是否正确的方法详解

    Java实现获取银行卡所属银行,验证银行卡号是否正确的方法详解

    这篇文章主要介绍了Java实现获取银行卡所属银行,验证银行卡号是否正确的方法,结合实例形式详细分析了java判断银行卡归属地及有效性的原理与相关实现技巧,需要的朋友可以参考下
    2019-09-09
  • java整合微信支付功能详细示例

    java整合微信支付功能详细示例

    这篇文章主要给大家介绍了关于java整合微信支付功能的相关资料,支付是一个复杂且测试起来需要的配置特别复杂的模块,文中给出了详细的示例代码,需要的朋友可以参考下
    2023-07-07
  • Java算法实现杨辉三角的讲解

    Java算法实现杨辉三角的讲解

    今天小编就为大家分享一篇关于Java算法实现杨辉三角的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01

最新评论