读取src/main/resources会导致NullPointerException。

35

在我的Maven项目中,我有一个xls文件在src/main/resources目录下。 我像这样读取它:

 InputStream in = new
 FileInputStream("src/main/resources/WBU_template.xls");

一切都好。

然而,我想使用getResourceAsStream将其读取为InputStream。但是当我这样做时,带斜杠或不带斜杠我总是得到NPE。

     private static final String TEMPLATEFILE = "/WBU_template.xls";
     InputStream in = this.getClass.getResourceAsStream(TEMPLATEFILE);
无论斜杠是否存在,或者我是否使用getClassLoader()方法,我仍然会得到一个空指针异常。 我还尝试过这个:
URL u = this.getClass().getResource(TEMPLATEFILE);
System.out.println(u.getPath());

控制台显示.../target/classes/WBU_template.xls,然后出现了NullPointer异常。

我做错了什么?

2个回答

52

FileInputStream将加载你传递给构造函数的文件路径,相对于Java进程的工作目录。

getResourceAsStream()将加载应用程序类路径下的一个文件路径。

当使用.getClass().getResource(fileName)时,它认为fileName的位置与调用类的位置相同。

当使用.getClass().getClassLoader().getResource(fileName)时,它认为fileName的位置是根目录 - 也就是bin文件夹。

在使用ClassLoader加载时,文件应位于src/main/resources

简而言之,在你的情况下,必须使用.getClass().getClassLoader().getResource(fileName)来加载文件。


1
谢谢。目前为止很清楚。问题是,以这种方式仍然无法访问src / main / resources文件夹中的xls文件。 - dutchman79
1
正如我之前提到的,尝试使用.getClass().getClassLoader().getResourceAsStream(fileName)。 - Rahul
另外,从文件名中移除斜杠。/WBU_template.xls => WBU_template.xls - Rahul
4
当我从IDE运行应用程序时,它运行得很好,但是当我将应用程序编译成jar文件后,它总是寻找路径myjar.jar!\myfile.txt。有任何线索吗? - Yasitha Waduge

2
我通常像这样从WEB-INF加载文件。
session.getServletContext().getResourceAsStream("/WEB-INF/WBU_template.xls")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接