栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

java 将文件加载为InputStream的不同方法

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 将文件加载为InputStream的不同方法

关于fileName你通过的方式的解释存在细微的差异。基本上,你有2种不同的方法:

ClassLoader.getResourceAsStream()
Class.getResourceAsStream()
。这两种方法将以不同的方式定位资源。

在中

Class.getResourceAsStream(path)
,该路径被解释为从中调用该类的包的本地路径。例如调用,
String.getResourceAsStream("myfile.txt")
将在你的类路径中的以下位置查找文件:
"java/lang/myfile.txt"
。如果你的路径以开头/,则它将被视为绝对路径,并且将从类路径的根开始搜索。因此,调用
String.getResourceAsStream("/myfile.txt")
将在你的类路径中查看以下位置
./myfile.txt

ClassLoader.getResourceAsStream(path)
将所有路径视为绝对路径。因此,调用
String.getClassLoader().getResourceAsStream("myfile.txt")
String.getClassLoader().getResourceAsStream("/myfile.txt")
都将在你的类路径中的以下位置查找文件:
./myfile.txt

每当我在这篇文章中提到一个位置时,它可能是你文件系统本身中的一个位置,也可能是相应的jar文件中的一个位置,具体取决于你从中加载资源的Class和/或ClassLoader。

在你的情况下,你是从

Application Server
加载类,因此应使用
Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)
而不是
this.getClass().getClassLoader().getResourceAsStream(fileName)。this.getClass().getResourceAsStream()
也可以。

阅读本文以获得有关该特定问题的更多详细信息。

对Tomcat 7及更低版本用户的警告

该问题的答案之一表明,对于Tomcat 7,我的解释似乎是不正确的。我试图四处看看,为什么会这样。

因此,我研究

WebAppClassLoader
了几种版本的Tomcat 的源代码。的实现
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()
更低版本的
Tomcat
版本时,必须格外小心。还必须记住
class.getResourceAsStream("/resource.txt")
实际调用的内容
classLoader.getResourceAsStream("resource.txt")
(/除去了开头)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/407657.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号