2017-03-07 16 views
2

私はJavaのリソースフォルダと春のブートアプリケーションを持っている:読むファイル

src 
| 
    main 
    | 
    resources 
    | 
     test 
     | 
     test1.json 
     test2.json 
     ... 

リソースフォルダでJSONファイルがあります。 IDE(IntelliJ)内でこれらのファイルを読むことができます。しかし、コンパイルされたJARファイルとして、私はNullpointer例外を取得します。

スプリングブートは、ファイルを次の場所にコピーします。BOOT-INF/classes/test JARファイル内のリソースファイルを読み取ることはできますか?私はファイル名を知らない。だから最初に、私はすべてのファイル名を取得し、各ファイルを読む必要があります。

アイデアはありますか?

私はこれを試してみました

UPDATE:それと

Resources[] resources = applicationContext.getResources("classpath*:**/test/*.json"); 

私はすべてのファイルパスを取得しています。しかし、それはあまりにも多くの時間を必要とする。私がファイル名を取得しても、ファイルをどのように読むことができますか?

+0

しようとしたことがありますか? – Barath

+0

これらがテストファイルの場合、src/main/resourcesではなく、src/test/resourcesに属していると思います。もしそうでなければ、それらをsrc/main/resourcesの下に置き、より分かりやすい名前を付けます。 classpath:test/test1.jsonおよびclasspath:test/test2.jsonからリソースをロードします。 – duffymo

+0

@duffymo私はそれをちょうど質問をここに掲示するためにちょうどそのように付けました。実際には、ファイルには他の名前が付いています。そして私が言ったように、私はそれらを直接呼び出すファイルの名前を知らない。私はフォルダ名を知っているだけです。 – CPA

答えて

2

以下の解決策では、ファイルをマップに読み込みます。

ここでは、あなたのリソースを読んで:ここで

Resource[] resources = applicationContext.getResources("classpath*:test/*.json"); 
for (Resource r: resources) { 
    processResource(r); 
} 

、あなたのリソースを処理する:あなたはResourceLoaderで

// you need to add a dependency (if you don't have it already) for com.fasterxml.jackson.core:jackson-databind 
ObjectMapper mapper = new ObjectMapper(); 

private void processResource(Resource resource) { 
    try { 
      Map<String, Object> jsonMap = mapper.readValue(resource.getInputStream(), Map.class); 

      // do stuffs with your jsoMap 

     } catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 
+0

私の最初のコメントとは反対に、クラスパスには "BOOT-INF/classes"がなくても動作しています。 – CPA

+0

素晴らしい!答えを編集させて – artemisian