当前位置: 首页 > 知识库问答 >
问题:

getResourceAsStream()仅在jar文件中返回null

郎雪风
2023-03-14

我知道同样的问题已经被问了很多次,但是通过已经发布的所有答案,我找不到解决方案。

首先,以下是我在项目中遇到问题后用来测试该问题的代码:

InputStream test;

System.out.println(this.getClass());
System.out.println(("classpath is: " + System.getProperty("java.class.path")));

test = getClass().getResourceAsStream("/pairs/images/100/back/back1.png");

if (test == null)
{
    System.out.println("getClass().getResourceAsStream(\"/pairs/images/100/back/back1.png\") is null");
    test = GridPanel.class.getClassLoader().getResourceAsStream("pairs/images/100/back/back1.png");
}

if (test == null)
{
    System.out.println("GridPanel.class.getClassLoader().getResourceAsStream(\"pairs/images/100/back/back1.png\") is null");
    test = ClassLoader.getSystemClassLoader().getResourceAsStream("pairs/images/100/back/back1.png");
}

if (test == null)
{
    System.out.println("ClassLoader.getSystemClassLoader().getResourceAsStream(\"pairs/images/100/back/back1.png\") is null");
    Thread.currentThread().getContextClassLoader().getResourceAsStream("pairs/images/100/back/back1.png");
}

if (test == null)
    System.out.println("Thread.currentThread().getContextClassLoader().getResourceAsStream(\"pairs/images/100/back/back1.png\") is null");

因此,根据标题,这些对getResourceAsStream()的调用都返回null,但只有在执行jar文件时,在IDE(Netbean 8.0.2)内启动时,它们都返回正确的流(单独测试不使用这段代码),我可以使用它。

所以我现在真的很困惑,我在使用netbeans构建时尝试过使用默认设置,但我对这个问题失去了理智。

任何提示或想法都将不胜感激!

共有3个答案

黄景胜
2023-03-14

这里有两个问题。

>

  • Windows不区分大小写。其他平台和jar内的名称区分大小写。

    getClass()类确定资源在哪个jar/class路径中被释放。尤其是单元测试不会放在jar中,或者子类可能位于jar之外。或者使用SomeClassInJar。类或使用类加载器搜索所有JAR/类路径。类加载器只使用绝对路径,并且不能以/开头。

  • 陈宜修
    2023-03-14

    太长别读这是由于一些愚蠢的问题与NTFS权限,移动罐子使它工作

    所以我现在觉得自己很愚蠢。。。

    我试着在Linux环境下运行它,一切正常。这些调用中的每一个都返回一个指向资源的非空InputStream。

    所以我做了一件非常简单的事情:在Windows中移动编译过的jar,检查它是否与NTFS权限有关(请记住,我使用的是管理员帐户,我可以在这些文件夹中自由地写、读和执行)。将其移动到项目的根目录下是不可行的,但将其移动到桌面上是可行的。

    更让我惊讶的是,在我正在做的项目的其他部分

    URL jarUrl = PairsDeck.class.getProtectionDomain().getCodeSource().getLocation();
    

    读取jar文件的全部内容,即使在旧目录中也可以,所以从一开始我就没有考虑过权限问题(我使用管理员权限从命令提示符启动它)。

    所以我想不知何故,由于NTFS权限的一些问题,程序可以通过该调用读取其jar,但不能从它在我的netbean项目文件夹中加载资源。

    增加一些困惑

    File file = new File(jarUrl.toURI());
    file.canWrite();
    file.canRead();
    file.canExecute(); 
    

    以上所有返回true。

    我只是想知道是否有一种方法可以更好地理解这个问题,并且可能有一种方法可以从java代码中发出一些权限错误的信号。

    衷心感谢所有相关人员的帮助!

    韦鸣
    2023-03-14

    我认为getResourceAsStream不是从文件系统读取,前导斜杠将尝试从类路径的根读取(如果添加目录,将从根读取)。如果你不放前导斜杠,你会从类所在的包中读取。

    是否在类路径中添加了要从中读取文件的目录/子目录?

     类似资料:
    • 我有以下问题 返回null,但是 返回InputStream,并且两个文件都在此文件夹中。有什么不对劲? 我使用的是libgdx-0.9.6

    • 问题内容: 我的项目目录结构(在Eclipse中): 在中,我有以下代码: 运行此命令时,将获得以下控制台输出: 为什么? 我放置在错误的位置了吗?我是否使用了ClassLoader API错误?还有吗 提前致谢! 问题答案: 如果在同一包装中使用 您拥有的方式 它在类路径的根目录中查找文件。你可以用 搜索规则在的javadoc和的javadoc中进行了说明。

    • 问题内容: 不知道这怎么可能。我重新阅读了getResourceAsStream,它始终返回null。 在Finder中(使用OS X和Eclipse),在test.java的旁边是test.xml 我可以在TextWrangler中打开它,并查看其中是否存在数据。 如果有什么不同,这是Junit测试。我去查看了系统上现有的Junit测试,并以与工作示例完全相同的方式来使用它(如文件所在的位置和代

    • 问题内容: 我正在从Java项目的已编译JAR中的包中加载文本文件。相关目录结构如下: 我的代码通过调用返回来加载文件。 无论我使用什么,都将始终打印输出。我不确定为什么上面的方法行不通,所以我也尝试了: 这些都不起作用。我 读 了许多 问题至今的话题,但他们都不是有帮助的-通常情况下,他们只是说,使用根路径,这我已经在做负载文件。那,或者只是从当前目录加载文件(只是),我也尝试过。该文件将使用适

    • 我不知道如何进行堆栈跟踪: NullPointerException

    • 问题内容: 我在Java Web应用程序中具有以下结构: 在中WS.java,我在Web方法中使用以下代码: 但是它总是返回null。我需要读取该文件,并且我读到如果将文件放入其中,则可以使用进行访问,但是该方法始终返回null。 对我可能做错的任何想法? 它正在工作,但是当我Clean and Build在Project上执行了a之后,它突然停止工作了 问题答案: 据我所知,该文件必须正确地放置