2017-03-07 81 views
2

我有一個Java資源文件夾中的春天啓動應用程序:讀取文件

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

在資源文件夾中有JSON文件。我可以在我的IDE(IntelliJ)中讀取這些文件。但作爲一個編譯的JAR文件,我得到了異常。

Spring Boot將文件複製到:BOOT-INF/classes/test是否可以讀取JAR文件中的資源文件?我不知道文件名。所以首先,我必須獲取所有文件名和讀取每個文件。

有沒有人有想法?

UPDATE

我已經試過這樣:

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

隨着那我收到的所有文件路徑。但是這需要太多時間。即使我獲得文件名,我將如何讀取這些文件?

+0

您是否嘗試過與資源加載? – Barath

+0

如果這些是測試文件,我會說他們屬於src/test/resources,而不是src/main/resources。如果沒有,我會把它們放在src/main/resources下,並給它們更明智的名字。從classpath加載資源:test/test1.json和classpath:test/test2.json。 – duffymo

+0

@duffymo我只是在這裏發佈問題而命名它。實際上這些文件有其他名稱。正如我所說的,我不知道直接調用它們的文件名稱。我只知道文件夾名稱。 – CPA

回答

2

以下解決方案會將文件讀取到一個Map中。

在這裏,你看你的資源:

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

在這裏,你處理你的資源:

// 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

與我的第一條評論相反,它也在classpath中沒有「BOOT-INF/classes」的情況下工作。 – CPA

+0

太棒了!讓我編輯答案 – artemisian