jar 中的 Java access files 会导致 java.nio.file.FileSystemNotFoundException

2022-08-31 15:40:59

尝试使用我的 java 应用将 jar 文件中的某些文件复制到临时目录时,会引发以下异常:

java.nio.file.FileSystemNotFoundException
    at com.sun.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:171)
    at com.sun.nio.zipfs.ZipFileSystemProvider.getPath(ZipFileSystemProvider.java:157)
    at java.nio.file.Paths.get(Unknown Source)
    at com.sora.util.walltoggle.pro.WebViewPresentation.setupTempFiles(WebViewPresentation.java:83)
   ....

这是我的一小部分(带有行号):setupTempFiles

81. URI uri = getClass().getResource("/webViewPresentation").toURI();
//prints: URI->jar:file:/C:/Users/Tom/Dropbox/WallTogglePro.jar!/webViewPresentation
82. System.out.println("URI->" + uri );
83. Path source = Paths.get(uri);

该目录位于我的jar的根目录中:webViewPresentation

enter image description here

只有当我将应用程序打包为jar时,此问题才会退出,在Eclipse中调试没有问题。我怀疑这与此错误有关,但我不知道如何纠正此问题。

任何帮助赞赏

如果重要:

我使用的是 Java 8 build 1.8.0-b132

视窗 7 Ult. x64


答案 1

A 表示无法自动创建文件系统;并且您尚未在此处创建它。FileSystemNotFoundException

给定您的 URI,您应该做的是拆分为 ,使用它前面的部分打开文件系统,然后从之后的部分获取路径:!!

final Map<String, String> env = new HashMap<>();
final String[] array = uri.toString().split("!");
final FileSystem fs = FileSystems.newFileSystem(URI.create(array[0]), env);
final Path path = fs.getPath(array[1]);

请注意,一旦你完成了它,你应该你的。.close()FileSystem


答案 2

接受的答案不是最好的,因为在IDE中启动应用程序或资源是静态的并存储在类中时,它不起作用!在 java.nio.file.FileSystemNotFoundException 中,当从资源文件夹获取文件时,提出了更好的解决方案

InputStream in = getClass().getResourceAsStream("/webViewPresentation");
byte[] data = IOUtils.toByteArray(in);

IOUtils来自Apache commons-io。

但是,如果您已经在使用Spring并且想要一个文本文件,则可以将第二行更改为

StreamUtils.copyToString(in, Charset.defaultCharset());

StreamUtils.copyToByteArray也存在。


推荐