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

Two*_*The 9 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);
}
Run Code Online (Sandbox Code Playgroud)

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

java.nio.file.FileSystemNotFoundException
    at com.sun.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:171))
Run Code Online (Sandbox Code Playgroud)

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

Two*_*The 8

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

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