当前位置: 首页 > 面试题库 >

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

席弘图
2023-03-14
问题内容

之间有什么区别:

InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileName)

InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)

InputStream is = this.getClass().getResourceAsStream(fileName)

什么时候每个人比另一个人更合适?

我要读取的文件作为读取文件的类在类路径中。我的类和文件位于同一jar中,并打包在EAR文件中,并部署在WebSphere 6.1中。


问题答案:

关于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")(/除去了开头)。



 类似资料:
  • 问题内容: 我可以使用ClassLoader实现从InputStream加载类吗? 我正在尝试将具有InputStream的JAR加载到新的ClassLoader中。 问题答案: 这不太可能,因为您会发现自己尝试这样做。您将无法根据需要随机访问和查找类,因此您必须将内容缓存在内存或文件系统中。 如果您在磁盘上缓存,则只需使用URLClassLoader即可。 如果缓存在内存中,则需要使用JarIn

  • 我目前正在制作一个Minecraft Mod Loader。 正如您在上面看到的,我有一个名为Client的类。当Minecraft游戏启动时,启动被调用。现在我有一个名为Mods的文件夹,在调用startup时,我需要将Mods从Mods文件夹加载到ArrayList命名模块中。更深入地说,每个Mod将有一个继承这个模块类的主类 因此,在调用startup时,我需要遍历mods文件夹中的每个Mo

  • 我需要加载不同服务器上存在的类文件,并在类文件中执行方法。我不想使用超文本传输协议或RMI,但想应用这种方法。我正在看URLClassLoader,但没有得到任何地方。有人能给我一个从不同服务器加载类的例子吗?

  • 我需要用PainterSVG编辑svg图片,但是它只加载了.svg文件,我收到的一些文件是.svgz 问题:我如何将那些.svgz文件转换成.svg文件?

  • 问题内容: 似乎有很多,很多方法的Java(阅读文本文件,等等),我个人最喜欢的是用在构造函数(它只是简单地使用mathy数据处理更好的作品,并有熟悉的语法)。 蜘蛛鲍里斯(Boris)也提到和。 有人可以解释每种方法的利弊吗?具体来说,我什么时候要使用它们? (编辑)我想我应该具体一点,并补充说我对这种方法有很强的偏好。所以真正的问题是,当 不会 想使用它? 问题答案: 让我们从头开始。问题是你

  • 我正在使用OWL API加载不同的文件并合并为一个进行推理。我有一个描述本体的文件和几个与个人的文件。当我打印它显示的公理时,每个个体都有foaf属性,例如,foaf:title “AnnotationAssertion(http://xmlns.com/foaf/0.1/title...” 多谢了。