web-dev-qa-db-ja.com

src / main / resourcesから読み取るとNullPointerExceptionが発生します

私の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が取得されます。

私は何を間違えていますか?

34
dutchman79

FileInputStreamは、Javaプロセスの作業ディレクトリからの相対パスとしてコンストラクターに渡すファイルパスをロードします。

getResourceAsStream() は、アプリケーションのクラスパスから相対的なファイルパスをロードします。

.getClass().getResource(fileName)を使用すると、fileNameの場所は呼び出し元クラスの場所と同じであると見なされます。

.getClass().getClassLoader().getResource(fileName)を使用すると、fileNameの場所がルート、つまりbinフォルダーであると見なされます。

クラスローダーを使用してロードする場合、ファイルは_src/main/resources_に配置する必要があります

つまり、.getClass().getClassLoader().getResource(fileName)を使用して、ケースにファイルをロードする必要があります。

51
Rahul

私は通常、このようにWEB-INFからファイルをロードします

session.getServletContext().getResourceAsStream("/WEB-INF/WBU_template.xls")
2
sainath reddy