classpath的jar包中读取文件

  • 在idea中读取resources下的文件没有问题(调用getFile),但是打成jar包就会出问题;
  • 使用spring的ClassPathResource或者hutool的ClassPathResource去解析文件都会有问题;
  • 但是使用上面两个工具去读取inputstream或者byte就没问题,因为内部都是调用ClassLoader的getResource方法,如果是文件,那么就是file://xxx,如果是jar包那么就会是jar:file://xxx;
  • 因为如果是读取文件,那么路径就是file://xxx,但是在jar包中就不存在这东西,只会存在jar:file://xxx。读取inputstream或者byte最终会被解析成url方式读取(调用url的openStream方法),url方式读取就可以读取到file://xxx或者jar:file://xxx,读取文件就不行
  • 所以遇到这种问题的时候不要试图去读取文件,而是要读取inputstream或者bytes
  • 有3种方式可以实现:1. 手动去使用ClassLoader获取,2. 使用spring的ClassPathResource,3. 使用hutool的ClassPathResource
  • 推荐:hutool的ClassPathResource,因为代码量少,并且不用捕获异常,hutool封装了ResourceUtil,使用getResourceObj或者readBytes方法都可以
  • 注意:文件名前不需要加classpath:,也不用加/这种绝对路径:
    • 错误示范:Resource resource = ResourceUtil.getResourceObj("classpath:/config/a.xlsx");
    • 正确示范:Resource resource = ResourceUtil.getResourceObj("config/a.xlsx");
posted @ 2023-07-26 16:37  神一样的存在  阅读(277)  评论(0编辑  收藏  举报