如何使用NIO从JAR读取文件?

时间:2013-10-10 19:02:29

标签: java nio

使用ClassLoader.getResourceAsStream(...)从可执行JAR文件本身读取文件对我来说是一个众所周知的概念,但我如何使用Java NIO做同样的事情?

目标是具有如下功能:

static String readFullyFromJar(String filename) {
    final Path path = Paths.get(Main.class.getResource(fileName).toURI());
    final byte[] bytes = Files.readAllBytes(path);
    return new String(bytes, CHARSET_ASCII);
}

虽然这在IDE中运行良好,但我得到了

java.nio.file.FileSystemNotFoundException
    at com.sun.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:171))

当我尝试使用真正的JAR时,即使目标文件位于正确的位置。

1 个答案:

答案 0 :(得分:8)

事实证明我上面的代码实际上是正确的,问题出在Java本身。

根据这个Bug ID,Java没有正确使用ZipFileSystemProvider。假设在Java 8中修复。(我的实际问题在此duplicate report中描述)