从BOOT-INF / classes中读取文件

时间:2017-03-07 18:13:40

标签: java spring spring-boot

我有一个带有java资源文件夹的Spring Boot应用程序:

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

在资源文件夹中有json文件。我可以在IDE(IntelliJ)中读取这些文件。但作为已编译的JAR文件,我得到Nullpointer例外。

Spring Boot将文件复制到:BOOT-INF/classes/test是否可以读取JAR文件中的资源文件?我不知道文件名。所以首先,我必须获取所有文件名并读取每个文件。

有没有人有想法?

更新

我试过这个:

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

我正在获取所有文件路径。但这需要太多时间。即使我得到文件名,我怎么读取文件?

2 个答案:

答案 0 :(得分:4)

以下解决方案会将文件读入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();
        }
    }
}

答案 1 :(得分:1)

这实际上使用ResourcePatternResolver

ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resolver.getResources("classpath*:test/*.json");

    for(Resource r: resources) {
        InputStream inputStream = r.getInputStream();
        File somethingFile = File.createTempFile(r.getFilename(), ".cxl");
        try {
            FileUtils.copyInputStreamToFile(inputStream, somethingFile);
        } finally {
            IOUtils.closeQuietly(inputStream);
        }
        LicenseManager.setLicenseFile(somethingFile.getAbsolutePath());
        log.info("File Path is " + somethingFile.getAbsolutePath());
    }