web-dev-qa-db-ja.com

BufferedReaderでリソースを読み取る

.JARに含まれるリソースを読み取ろうとしていますが、次のnullPointerを取得します。

bReader = new BufferedReader(new InputStreamReader(
                  this.getClass().getResourceAsStream("resources/" + fileName)));

ただし、ファイルの使用は正常に機能します。

bReader = new BufferedReader(new FileReader(new File("resources/" + fileName)));
12
Skogen

IDEまたはMavenまたはビルドプロセスにルートのjar内の「リソース」の内容が含まれると想定して、「/」で見つけてみてください。

bReader = new BufferedReader(new InputStreamReader(
                           this.getClass().getResourceAsStream("/" + fileName)));

更新:

「resources」フォルダーがソースフォルダーとして構成されていることを確認してください。

20
sgp15

これはSpringフレームワークプロジェクトですか?試してください:

BufferedReader bufferedReader = new BufferedReader(
          new InputStreamReader(new ClassPathResource("XML_Request.xml").getInputStream()));

ロードするリソースは、src/main/resourcesディレクトリにあります。

Resource to load is sitting in the src/main/resources directory

2
ranma2913

「resources」フォルダをリソースフォルダとして設定します。このコードを試してください:

bReader = new BufferedReader(new
         InputStreamReader(getClass().getClassLoader().getResourceAsStream(fileName)))
1
brandy

これは、リーダークラスと読み取られるファイルが異なるパッケージに含まれているためです。 this.getClass().getRasourceAsStream("resource/file_name")が呼び出されると、現在のリーダークラスが存在するパッケージディレクトリ内のリソースディレクトリが検索され、見つかった場合は「file_name」ファイルが検索されます。したがって、ファイルが存在しない場合はnullを返します。

この場合、それに応じて現在のファイルリーダークラスディレクトリから戻る必要があり、次にファイルへのパスを指定する必要があります。ディレクトリから戻るには、_../_を使用する必要があります

たとえば、Readerクラスパッケージの場合:_package com.abc.util;_ファイルが次の場所に存在する:_com.abc.template;_次に、次のようにgetResourceAsStream()メソッドを呼び出す必要があります。

_bReader = new BufferedReader(new InputStreamReader(
                  this.getClass().getResourceAsStream("../template/" + fileName)));
_
0
Rashanand

getClassLoader().getResourceAsStream(filename)とは異なり、getClass().getResourceAsStream(filename)を使用しているバージョンは、クラスパスルートではなく、クラスの場所に相対的なパスを使用します。絶対パスgetClass().getResourceAsStream("/" + filename)を使用するか、ClassLoaderバージョンを使用する必要があります。

また、「resources」がクラスパスにあることを確認してください(Mavenを使用している場合は、pom.xmlに対して「src/main/resources」である必要があります)。その場合、ファイル名に「リソース」を実際に含める必要はありません。これは、クラスパスルートであるためです。

0
Adam Burley