在我的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。
我做错了什么?
答案 0 :(得分:51)
FileInputStream将从Java进程的工作目录中加载您传递给构造函数的文件路径。
getResourceAsStream()将从应用程序的类路径加载相对的文件路径。
使用.getClass().getResource(fileName)
时,它认为fileName的位置与调用类的位置相同。
使用.getClass().getClassLoader().getResource(fileName)
时
它认为fileName的位置是根 - 换句话说就是bin文件夹。
使用类加载器
加载时,文件应位于src/main/resources
简而言之,您必须使用.getClass().getClassLoader().getResource(fileName)
在您的案例中加载文件。
答案 1 :(得分:2)
我通常像这样从WEB-INF加载文件
session.getServletContext().getResourceAsStream("/WEB-INF/WBU_template.xls")