48

不知道这怎么可能。我重新阅读了 getResourceAsStream 并且它总是返回 null。

InputStream source = this.getClass().getResourceAsStream("test.xml");

Finder 中的 test.java 旁边(使用 OS X 和 Eclipse)是 test.xml

我可以在 TextWrangler 中打开它,并将其视为现有的数据。

如果有任何区别,这是一个 Junit 测试。我去查看了我们系统上现有的 Junit 测试,并以与工作示例完全相同的方式使用它(如文件所在的位置和代码本身)。

有什么小区别会阻止我假设 getClass() 返回正确的路径?

谢谢!

4

13 回答 13

30

它没有在类路径上找到资源。如果您使用的是 junit 和 maven,请确保通过在部分添加<include>文件指令将资源复制到目标/测试类<testResource>

您还可以通过使用找出您的类在文件系统中的位置

this.getClass().getResource(".")

并检查资源是否存在

于 2011-06-30T21:12:02.703 回答
25

getResourceAsStream()正在使用 CLASSPATH,因此它将从您的类所在的任何位置加载,而不是您的源文件。

我怀疑您需要将 XML 复制到与 .class 文件相同的目录中。

于 2011-03-08T20:44:15.040 回答
22

如果您使用的是 Maven,请将此部分添加到您的pom.xml

<build>
    <testResources>
        <testResource>
            <directory>${project.basedir}/src/test/resources</directory>
        </testResource>
    </testResources>
</build>

test.xml和其他资源文件必须位于src/test/resources

于 2015-03-26T13:45:27.547 回答
12

我总是对这种方法有问题。这里有2个链接,可能有用:

我总是尝试在开头添加“/”或“./”。

根据我的经验,最好的方法是使用 FileInputStream。只需记住一件事(在 Eclipse 中使用 FileInputStream 时),默认设置下,您的工作目录设置为项目根目录。您始终可以使用这段代码检查您的当前目录在哪里(以及您需要哪些相对路径) 。

于 2011-03-08T21:12:36.747 回答
9

假设test.xml位于您的test根源文件夹下,请执行以下操作:-

InputStream source = this.getClass().getClassLoader().getResourceAsStream("test.xml");
于 2011-03-08T21:51:46.727 回答
3

我在这个问题上花了很多时间,但它缺少以下配置:右键单击一个 Eclipse 项目并选择Properties -> Java Build Path -> Source 并编辑Included行并添加 *.properties (*.fileExtension)

于 2017-12-21T19:21:02.467 回答
2

将 test.xml 放在 src/main/resources(或 src/test/resources)中。

File file = ResourceUtils.getFile("classpath:test.xml");
String test = new String(Files.readAllBytes(file.toPath()));
于 2019-10-23T05:49:42.053 回答
2

尝试使用类加载器

InputStream source = this.getClass().getClassLoader().getResourceAsStream("test.xml");
于 2020-03-02T11:00:28.517 回答
0

来自 Java API:

http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getSystemResource(java.lang.String)

从用于加载类的搜索路径中查找指定名称的资源。该方法通过系统类加载器定位资源

所以语法例如是: ClassLoader.getSystemResource("test.xml").toString();

奇迹般有效!

于 2013-06-12T09:10:46.547 回答
0

试试 MyClass.getResourceAsStream()。

还可以尝试将 test.xml 放在您的类路径中。例如,在 Eclipse Web 项目中,将 text.xml 放入 webcontent/WEB-INF/classes

于 2011-03-08T21:10:58.373 回答
-1

将包含资源文件的文件夹添加到 eclipse 的源文件夹中。然后该文件应自动放入 bin 目录中。

于 2012-02-09T00:21:05.547 回答
-1

您需要将资源文件的副本放到测试资源中,在我的示例中是字体文件:

在此处输入图像描述

然后从您的 jUnit 测试中调用 next :

 public static InputStream getFontAsStream() throws IOException {
        return Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("fonts/" + "FreeSans.ttf");
    }
于 2017-07-26T07:23:17.967 回答
-2

我在 Spring 课程中遇到了这个问题。System.class.getResourceAsStream(...)在单元测试中工作但不在 Tomcat 中Thread.currentThread().getContextClassLoader().getResourceAsStream(...)工作,在 Tomcat 中工作但不在单元测试中。

最终我选择了:

ClassUtils.getDefaultClassLoader()
    .getResourceAsStream("com/example/mail/templates/invoice-past-due.html"))

我还发现,一旦我这样做了,我就不需要以斜线开头的路径了。

于 2016-11-11T23:12:44.480 回答