ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

日常踩坑_jar包读取不到资源文件

2022-06-21 19:34:48  阅读:173  来源: 互联网

标签:文件 读取 BufferedInputStream getResource jar css 资源 日常


背景提要

之前不是为了导出word使用了一个WordUtil工具类嘛,这个工具类中需要一个资源文件css,然后就将该资源文件放在了WordUtil同包下的resources文件夹下
然后使用BufferedInputStream bufferedInputStream = (BufferedInputStream) Resources.getResource("css/quill.core.css").getContent();来获取到css文件
这一切到这里还相当美好,因为本地导出正常,富文本也在生效
但是! 但是当被打成jar包发布到线上后,一切都不一样了/(ㄒoㄒ)/~~
word无法导出,原因是找不到css文件

先说结论

即便是资源信息也被打包到了jar包里,根据Resources.getResource也无法查找到资源文件
正确方式是让类加载器去找,然后我就把上面那句代码改换为了下面这句:
BufferedInputStream bufferedInputStream =(BufferedInputStream) this.getClass().getClassLoader().getResourceAsStream("css/quill.core.css")
本地依旧是风和日丽,你好我好的一片完美景象
但是!但是jar包运行的时候,又又又又报错了,还好这次的报错信息just只是类型转换的错误
ZipInflaterInputStream cannot be cast to java.io.BufferedInputStream,报了一个这个的错,好嘛,不能强转
看了一下ZipInflaterInputStream 和 BufferedInputStream都是InputStream的子类,那就取消强转
来了,最终版本:
InputStream bufferedInputStream = this.getClass().getClassLoader().getResourceAsStream("css/quill.core.css");

原因:

getResource() 方法的获取范围仅限于 指定的范围classpath,classpath 之外的资源是无法获取到的。
而 jar 是被我们包含在 classpath 中的
所以这类资源一般是存在于 classpath 中的文件
我们可以使用上面的 getResource()方法获取到其路径,(通常样式是资源所在文件的路径+资源在文件中的路径)但是没有办法直接通过文件读取到。
但是可以通过 classLoader 对象中的 getResourceAsStream()方法获取到资源的输入流。
通过 getResourceAsStream() 方法获取资源的输入流实际上是通过 URL 对象,通过 openStream()方法打开的,因此我们只需要拿到正确的资源URL 地址,就能够获得该类资源的输入流了。

跳坑结束,祝你快乐!

标签:文件,读取,BufferedInputStream,getResource,jar,css,资源,日常
来源: https://www.cnblogs.com/deanCopy/p/16398037.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有