Java 如何调试getResourceAsStream()?
我的Java代码如下: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
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的大部分旧源代码是一项艰巨的任务。