2

我在使用 java nio 遍历 zip 文件的 VFS(虚拟文件系统)的文件树时遇到异常,这是我的代码:

public static void list(String zipFilePath) throws IOException{
    FileSystem fs = FileSystems.newFileSystem(Paths.get(zipFilePath), null);
    Path startPath = fs.getPath("/");

    Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
            System.out.println("Dir : " + dir);
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            System.out.println("\t->File : " + file);
            return FileVisitResult.CONTINUE;
        }
    });
}

异常表示文件不存在,但我已经解压缩存档(zip),并且文件在那里......知道为什么吗?

这是一个例外:

java.nio.file.NoSuchFileException: /Dir1/Dir2/Dir3/Dir4/ExcelFile.xlsm
at com.sun.nio.zipfs.ZipPath.getAttributes(ZipPath.java:657)
at com.sun.nio.zipfs.ZipFileSystemProvider.readAttributes(ZipFileSystemProvider.java:285)
at java.nio.file.Files.readAttributes(Files.java:1669)
at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:105)
at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:199)
at java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:69)
at java.nio.file.Files.walkFileTree(Files.java:2585)
at java.nio.file.Files.walkFileTree(Files.java:2618)

顺便说一句:代码确实有效,但它与某些文件崩溃

4

2 回答 2

6

当您使用 aZipFileSystem时,它会管理存储路径(请记住,zip 中没有文件夹,只有文件,并且每个文件都由其完整路径名标识,直到选择要压缩的目录级别,因此它不是 zip 中的“myTextFile.txt”,其命名为“/Folder 1/Folder 2/myTextFile.txt”);使用Path 总是 使用“标准”文件分隔符(*nix OS)返回名称,但如果您的 zip 存档是使用 windows 文件分隔符存储的,它只会失败,如果您使用相同的方法创建文件,则不会发生这种情况你将使用打开,我的意思是,如果你使用ZipOutputStreamZipEntry压缩你的文件,然后ZipFileSystem解压缩它,如果你不注意文件分隔符,它会失败。

现在,您可能会说,在您的情况下,为什么它仅在 zip 中的某些文件时失败,那么,当我使用导致此问题的软件时,我正在使用压缩文件ZipOutputStream ZipEntry,并且Path,我“手动”浏览文件树,直到我找到一个文件,并添加一个我正在使用的 zip 条目Path,然后将String要保存的文件的名称添加到名称中,并通过连接它来添加分隔符 ( +"/"+)。

你可能会说“好吧,我明白你在说什么,但是,为什么当你使用第三方软件解压缩存档时它会工作?”,这很简单,因为它们替换了所有文件分隔符在每个文件名中查找以确保它们始终使用相同的文件分隔符,无论是“/”还是“\”...

经验教训:不要混合东西!!!使用一种方法来压缩和解压缩您的档案,或者确保所有信息都存储在相同的“名称”下,确保您每次都使用完全相同的文件分隔符。

于 2013-08-29T13:37:20.363 回答
0

我知道这是一个旧帖子,但这恰好发生在我身上。我所有的 zipfile 都是由第三方创建的,即 Microsoft Word。我什至无法捕获异常以找出 zip 中的哪个输入文件导致 NoSuchFileException,因为 Java 编译器说:

NoSuchFileException 无法解析为类型

于 2021-07-28T01:53:01.493 回答