将文件作为输入流加载时,'ClassLoader.getResourceAsStream()”和'Class.getResourceAsStream()”有何不同?
将文件加载为InputStream的不同方法
传递的文件名的解释存在细微的差异。基本上有两种不同的方法:ClassLoader.getResourceAsStream() 和 Class.getResourceAsStream()。这两种方法以不同的方式查找资源。
在 Class.getResourceAsStream(path) 中,路径被解释为调用它的类的包内的路径。例如,调用 String.class.getResourceAsStream("myfile.txt") 将在类路径中的以下位置查找文件:“java/lang/myfile.txt”。如果您的路径以 / 开头,它将被视为绝对路径,并且搜索将从类路径的根开始。因此,当您调用 String.class.getResourceAsStream("/myfile.txt") 时,它会查看类路径中的以下位置:./myfile.txt。
ClassLoader.getResourceAsStream(path) 将所有路径视为绝对路径。因此,如果您调用 String.class.getClassLoader().getResourceAsStream("myfile.txt") 和 String.class.getClassLoader().getResourceAsStream("/myfile.txt"),在这两种情况下,它将位于类路径中在以下位置查找文件:./myfile.txt。
每当我在这篇文章中提到一个位置时,它可能是一个文件系统本身或相应 JAR 文件中的位置,具体取决于您从中加载资源的类和/或 ClassLoader。
在您的情况下,您正在从应用程序服务器加载类,因此你应该使用 Thread.currentThread().getContextClassLoader().getResourceAsStream(filename) 而不是 this.getClass().getClassLoader().getResourceAsStream(filename) 。 this.getClass().getResourceAsStream() 也有效。
阅读本文以获取有关此特定问题的更多信息。
Tomcat 7 及更低版本用户的注意事项
这个问题的答案之一指出我对 Tomcat 7 的解释似乎不正确。我试图弄清楚为什么会这样。
所以我查看了不同 Tomcat 版本的 Tomcat WebAppClassLoader 的源代码。 findResource(String name) 的实现(最终负责请求资源的 URL)在 Tomcat 6 和 Tomcat 7 中几乎相同,但在 Tomcat 8 中有所不同。
在版本 6 和 7 中,实现不会尝试规范化资源名称。这意味着在这些版本中, classLoader.getResourceAsStream("/resource.txt") 可能不会给出与 classLoader.getResourceAsStream("resource.txt") 相同的结果,即使它应该(如 Javadoc 中所述)。 [源代码]
但是,在版本8中,资源名称被规范化,以确保使用资源名称的绝对版本。因此,上述两个调用在 Tomcat 8 中应始终产生相同的结果。 [源代码]
因此,在 Tomcat 8 之前的版本上使用 ClassLoader.getResourceAsStream() 或 Class.getResourceAsStream() 时需要格外小心。并且您还必须记住,class.getResourceAsStream("/resource.txt") 实际上调用了 classLoader.getResourceAsStream("resource.txt")(删除了前导 /)。
以上是将文件作为输入流加载时,'ClassLoader.getResourceAsStream()”和'Class.getResourceAsStream()”有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

公司安全软件导致部分应用无法正常运行的排查与解决方法许多公司为了保障内部网络安全,会部署安全软件。...

将姓名转换为数字以实现排序的解决方案在许多应用场景中,用户可能需要在群组中进行排序,尤其是在一个用...

系统对接中的字段映射处理在进行系统对接时,常常会遇到一个棘手的问题:如何将A系统的接口字段有效地映�...

在使用MyBatis-Plus或其他ORM框架进行数据库操作时,经常需要根据实体类的属性名构造查询条件。如果每次都手动...

在使用IntelliJIDEAUltimate版本启动Spring...

Java对象与数组的转换:深入探讨强制类型转换的风险与正确方法很多Java初学者会遇到将一个对象转换成数组的�...

电商平台SKU和SPU表设计详解本文将探讨电商平台中SKU和SPU的数据库设计问题,特别是如何处理用户自定义销售属...

Redis缓存方案如何实现产品排行榜列表的需求?在开发过程中,我们常常需要处理排行榜的需求,例如展示一个�...
