JAR中的Spring Boot ClassPathResource

时间:2017-03-28 03:41:28

标签: java spring spring-boot

在我的Spring Boot 1.5应用程序中,我使用ClassPathResource读取应用程序JAR的静态文件:

// ...
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

@Slf4j
@Service
public class MyService {
    private Resource resource = new ClassPathResource("a.txt");
    private List<String> myStrings;
    public MyService() {
        myStrings = load(resource);
    }

    private List<String> load(Resource resource) {
        try(Stream<String> stream = Files.lines(Paths.get(resource.getURI()))) {
            myStrings = stream.filter(/* my filter */)
                      .collect(Collectors.toList());
        } catch (IOException x) {
            log.error("Failed to read '{}'.", resource.getFilename());
        }
    }
}

但是失败了:

Caused by: java.nio.file.FileSystemNotFoundException: null
    at com.sun.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:171) ~[zipfs.jar:1.8.0_121]
    at com.sun.nio.zipfs.ZipFileSystemProvider.getPath(ZipFileSystemProvider.java:157) ~[zipfs.jar:1.8.0_121]
    at java.nio.file.Paths.get(Paths.java:143) ~[na:1.8.0_121]
    at MyService.load(MyService.java:53) ~[classes!/:2.0.0-SNAPSHOT]
    //...

如何阅读我的应用程序JAR中嵌入的ClassPathResource

1 个答案:

答案 0 :(得分:2)

JDK的Paths.get无法解析JAR文件中的资源,因此请替换:

    Files.lines(Paths.get(resource.getURI()))

使用:

    new BufferedReader(new InputStreamReader(resource.getInputStream())).lines();