如何调试getResourceAsStream()?

时间:2016-08-24 18:16:41

标签: java apache-commons

我的Java代码如下:

InputStream in = getClass().getResourceAsStream("hello/say_hello.txt");
System.out.println ("InputStream = " + in + " and CWD is: " + System.getProperty("user.dir"));
IOUtils.copy(in, out);

我从~/work/my_project

运行测试

我加载的文件的完整路径为~/work/my_project/hello/say_hello.txt

但是在运行上面的例子时,我得到了:

InputStream = null and working directory is !~/work/my_project
java.lang.NullPointerException: null
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1792) ~[commons-io-2.4.jar:2.4]
    at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1769) ~[commons-io-2.4.jar:2.4]
    at org.apache.commons.io.IOUtils.copy(IOUtils.java:1744) ~[commons-io-2.4.jar:2.4]
    at myproject.addTestUser(Validation.java:157) ~[classes/:na]

现在,我的问题是:我该如何调试? 如何打印getResourceAsStream()扫描的路径,如何将当前工作目录添加到其中?

注意:以上是更大代码库的精简版本,在此处共享整个项目是不可行的。

3 个答案:

答案 0 :(得分:1)

当前工作目录与getResource(AsStream)函数无关。后者适用于您的类路径,它可能包含起始目录,但更可能只包含JAR。如果在IDE中运行,则通常src / main / resources / *位于类路径中。

答案 1 :(得分:1)

因为路径" hello / say_hello.txt"不以" /"开头,Class.getResourceAsStream会将其参数解释为相对路径。相对于什么?相对于包含正在进行加载的类的包。

所以,让我们说你有一个班级com.example.Foo,在那个班级你叫getClass().getResourceAsStream("hello/say_hello.txt")。这将尝试加载名为" com / example / hello / say_hello.txt"的资源。它将在类路径中列出的任何目录下查找此文件,或者在类路径中的任何JAR内的此位置查找。

如何让文件进入JAR?正如@eckes所提到的,如果你把文件放在你的源代码树中,大多数流行的IDE和构建工具都会为你处理这个问题.src / main / resources / com / example / hello / say_hello.txt" 。您可以view the contents of the JAR(或将JAR重命名为文件扩展名为" .zip"并解压缩)以确保文件存在。

答案 2 :(得分:0)

虽然这不是不可能,但调试JRE代码将是一项艰巨的任务。我建议您仔细阅读public documentation

您可以在目录/ jar文件中看到getResourceAsStream个搜索文件,您的课程已从加载。

如果您想要一个更清晰的表单,它在加载资源时解析的实际路径是什么,我建议您尝试使用非常相似的getResource方法来查看返回的网址。< / p>