私の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が取得されます。
私は何を間違えていますか?
FileInputStreamは、Javaプロセスの作業ディレクトリからの相対パスとしてコンストラクターに渡すファイルパスをロードします。
getResourceAsStream() は、アプリケーションのクラスパスから相対的なファイルパスをロードします。
.getClass().getResource(fileName)
を使用すると、fileNameの場所は呼び出し元クラスの場所と同じであると見なされます。
.getClass().getClassLoader().getResource(fileName)
を使用すると、fileNameの場所がルート、つまりbinフォルダーであると見なされます。
クラスローダーを使用してロードする場合、ファイルは_src/main/resources
_に配置する必要があります
つまり、.getClass().getClassLoader().getResource(fileName)
を使用して、ケースにファイルをロードする必要があります。
私は通常、このようにWEB-INFからファイルをロードします
session.getServletContext().getResourceAsStream("/WEB-INF/WBU_template.xls")