Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何调试getResourceAsStream()?_Java_Apache Commons - Fatal编程技术网

Java 如何调试getResourceAsStream()?

Java 如何调试getResourceAsStream()?,java,apache-commons,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\u p

我的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\u project/hello/say\u 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()
扫描的路径,以及如何将当前工作目录添加到其中


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

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

尽管这并非不可能,但调试JRE代码将是一项艰巨的任务。我建议您仔细阅读以下内容:

您将看到
getResourceAsStream
search files位于您的类从中加载的目录/jar文件上

如果您想更清楚地了解加载资源时解析到的实际路径,我建议您尝试非常类似的方法,查看返回的URL。

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

假设您有一个类
com.example.Foo
,在该类中调用
getClass().getResourceAsStream(“hello/say_hello.txt”)
。这将尝试加载名为“com/example/hello/say_hello.txt”的资源。它将在类路径中列出的任何目录下,或者在类路径中任何JAR中的该位置查找该文件


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

首先;我当然希望你在那
InputStream
上呼叫
close
getClass().getResourceAsStream()
只需扫描
类路径
。无需调试。可能该文件不可用、不可读或正被其他程序使用。该目录是否在类路径上?资源嵌入在JAR文件中,或已编译应用程序的目录结构中。“我不明白当前的工作目录应该是其中的一部分。如果你只是想读取一个文件,为什么不使用这个类呢?”Boristeider说。我的意思是,遵循JRE的大部分旧源代码是一项艰巨的任务。