为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

婷婷同学_ 2019-06-24 10:18:59
将文件加载为InputStream的不同方法在以下几个方面有什么区别:InputStream is = this.getClass().getClassLoader().getResourceAsStream(fileName)和InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)和InputStream is = this.getClass().getResourceAsStream(fileName)什么时候每个人比其他人更适合使用?我想要读取的文件与读取该文件的类一样位于类路径中。我的类和文件在同一个JAR中,打包在EAR文件中,并部署在WebSphere6.1中。
查看完整描述

3 回答

?
千万里不及你

TA贡献1784条经验 获得超9个赞

fileName你正在经过被解释。基本上,您有两种不同的方法: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文件中的位置,这取决于您要从哪个类和/或ClassLoader加载资源。

在您的示例中,您正在从ApplicationServer加载类,因此您应该使用Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)而不是this.getClass().getClassLoader().getResourceAsStream(fileName)this.getClass().getResourceAsStream()也会起作用的。

朗读,阅读这篇文章有关该特定问题的更详细信息。


对Tomcat 7及以下用户的警告

这个问题的一个答案是,我对Tomcat 7的解释似乎是不正确的。我试着环顾四周,看看为什么会这样。

所以我看了Tomcat的源代码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中,上面描述的两个调用应该始终返回相同的结果。[源代码]

因此,在使用ClassLoader.getResourceAsStream()Class.getResourceAsStream()在早于8的Tomcat版本中。class.getResourceAsStream("/resource.txt")实际上打电话classLoader.getResourceAsStream("resource.txt")(领先/被剥光)。


查看完整回答
反对 回复 2019-06-24
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

使用MyClass.class.getClassLoader().getResourceAsStream(path)若要加载与代码关联的资源,请执行以下操作。使用MyClass.class.getResourceAsStream(path)作为快捷方式,并用于打包在类包中的资源。

使用Thread.currentThread().getContextClassLoader().getResourceAsStream(path)若要获取作为客户端代码一部分的资源,请不要严格限制调用代码。您应该小心这一点,因为线程上下文类加载器可能指向任何东西。


查看完整回答
反对 回复 2019-06-24
?
守候你守候我

TA贡献1802条经验 获得超10个赞

在普通的旧Java 7上使用普通的旧Java,没有其他依赖关系,这说明了这种区别。

我把file.txt在……里面c:\temp\我把c:\temp\在类路径上。

只有一种情况下,这两个电话之间有区别。

class J {

 public static void main(String[] a) {
    // as "absolute"

    // ok   
    System.err.println(J.class.getResourceAsStream("/file.txt") != null); 

    // pop            
    System.err.println(J.class.getClassLoader().getResourceAsStream("/file.txt") != null); 

    // as relative

    // ok
    System.err.println(J.class.getResourceAsStream("./file.txt") != null); 

    // ok
    System.err.println(J.class.getClassLoader().getResourceAsStream("./file.txt") != null); 

    // no path

    // ok
    System.err.println(J.class.getResourceAsStream("file.txt") != null); 

   // ok
   System.err.println(J.class.getClassLoader().getResourceAsStream("file.txt") != null); 
  }}


查看完整回答
反对 回复 2019-06-24
  • 3 回答
  • 0 关注
  • 453 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号