为何getResource在JAR中失效而getResourceAsStream可正常加载资源?
getResource() 与 getResourceAsStream() 加载JAR内资源的差异原因
核心差异本质
getResource()返回的是URL对象,它的指向逻辑分两种场景:- 本地开发/单元测试时,资源文件是磁盘上的独立文件,此时URL指向真实的文件系统路径,能直接通过路径访问文件;
- 打包成JAR后,资源被嵌入到JAR压缩包内部,此时URL的格式为
jar:file:/xxx.jar!/ids.csv——这种路径并非真实的文件系统路径,无法被当作普通文件处理,因此会触发"文件找不到"的错误。
getResourceAsStream()直接返回资源的输入流:
它跳过了文件路径的依赖,直接通过类加载器读取资源的字节内容,不管资源是在磁盘还是JAR包内部,只要处于classpath下,就能通过流的方式读取数据,因此打包成JAR后也能正常工作。
补充说明
如果一定要使用getResource(),也可以通过URL.openStream()获取输入流来读取JAR内资源,本质和getResourceAsStream()的逻辑一致,但多了一步URL的处理,不如直接用后者简洁。
内容的提问来源于stack exchange,提问作者Robinson Wei
相关产品推荐
相关产品推荐

