35

在我的 Maven 项目中,我在 src/main/resources 中有一个 xls 文件。当我这样读时:

 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() 方法,我仍然得到一个 NullPointer。

我也试过这个:

URL u = this.getClass().getResource(TEMPLATEFILE);
System.out.println(u.getPath());

控制台说.../target/classes/WBU_template.xls 然后获取我的 NullPointer。

我究竟做错了什么 ?

4

2 回答 2

52

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

getResourceAsStream()将加载相对于应用程序类路径的文件路径。

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

当您使用.getClass().getClassLoader().getResource(fileName) 它时,文件名的位置是根目录 - 换句话说就是 bin 文件夹。

src/main/resources使用类加载器加载时文件应位于

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

于 2012-12-20T07:47:26.443 回答
2

我通常像这样从 WEB-INF 加载文件

session.getServletContext().getResourceAsStream("/WEB-INF/WBU_template.xls")
于 2012-12-20T07:41:48.680 回答