有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java getResourceAsStream()地狱

谁能告诉我怎么做吗。getResourceAsStream()真的很有效。我试图找出痛苦的事实,在某些情况下是getClass()。getResourceAsStream(名称);在eclipse中可以正常工作,但在部署版本(NPE)中不行。我面临的另一个事实是,有时getClass()。getResource(名称);返回完全有效的url,但getClass()。getResourceAsStream(名称);返回null。是否有人编写了一个库,我只需传递包(路径)和文件名,就可以无需唠叨地接收流

编辑:每当我不得不使用getResourceAsStream()时,这都会影响我。是的,我可以提供一个针对实际情况截取的代码,但在我不了解getResourceAsStream如何工作之前,这对我下一次没有帮助

编辑2:以下两者的区别是什么:

MyClass.class.getResourceAsStream(...)
this.getClass().getResourceAsStream(...),    
MyClass.class.getClassLoader().getResourceAsStream(...)
Thread.currentThread().getContextClassLoader().getResourceAsStream(...)

编辑3: 此外,虽然some.package.SomeClass.class.getResourceAsStream("/path/only/holding/resource.files")无法在不包含类而只包含文件的类路径中加载资源。这个变体能够做到这一点:ClassLoader.class.getResourceAsStream("/path/only/holding/resource.files")这让我很困惑,所以我真的更喜欢spring对模式类路径URI所做的事情:


共 (3) 个答案

  1. # 1 楼答案

    规则很简单。假设您的类在包com.foo

    在此类上调用getResource("bar/bla.txt")(无前导/)将在包com.foo.bar中的bla.txt中查找文件。因此,路径是相对于类的包的。类路径用于查找文件,就像类路径用于查找类一样

    在此类上调用getResource("/bar/bla.txt")(前导/)将在包bar中的bla.txt中查找文件。因此,路径是一条绝对路径,从类路径的根开始。类路径用于查找文件,就像类路径用于查找类一样

    而且您可能没有像文件系统路径那样包含...的路径

  2. # 2 楼答案

    当您搜索的资源位于类的同一个jar中时,性能会更好

    例:我的手机号码1。jar/xsl/test。xsl和MyPackageUnber1中的类。jar/com。foo/TestGetResourceAsStream(“/xsl/test.xsl”)

    当将资源打包到不同的jar中时,当项目有非常多的jar包时,我遇到了性能问题

    例:我的手机号码1。jar/xsl/test。xsl和中的类 我的手机号码是42。jar/com。foo/TestGetResourceAsStream(“/xsl/test.xsl”)

  3. # 3 楼答案

    您必须了解,它与类路径相关

    如果在eclipse上运行时与作为部署版本运行时有不同的类路径,则可以得到不同的结果

    javadocs也很有解释性