我知道同样的问题已经被问了很多次,但是通过已经发布的所有答案,我找不到解决方案。
首先,以下是我在项目中遇到问题后用来测试该问题的代码:
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构建时尝试过使用默认设置,但我对这个问题失去了理智。
任何提示或想法都将不胜感激!
这里有两个问题。
>
Windows不区分大小写。其他平台和jar内的名称区分大小写。
getClass()
类确定资源在哪个jar/class路径中被释放。尤其是单元测试不会放在jar中,或者子类可能位于jar之外。或者使用SomeClassInJar。类
或使用类加载器搜索所有JAR/类路径。类加载器只使用绝对路径,并且不能以/
开头。
太长别读这是由于一些愚蠢的问题与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代码中发出一些权限错误的信号。
衷心感谢所有相关人员的帮助!
我认为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之后,它突然停止工作了 问题答案: 据我所知,该文件必须正确地放置