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

将文件加载为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中。


婷婷同学_
浏览 454回答 3
3回答

千万里不及你

在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")(领先/被剥光)。

慕姐8265434

使用MyClass.class.getClassLoader().getResourceAsStream(path)若要加载与代码关联的资源,请执行以下操作。使用MyClass.class.getResourceAsStream(path)作为快捷方式,并用于打包在类包中的资源。使用Thread.currentThread().getContextClassLoader().getResourceAsStream(path)若要获取作为客户端代码一部分的资源,请不要严格限制调用代码。您应该小心这一点,因为线程上下文类加载器可能指向任何东西。

守候你守候我

在普通的旧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);    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java