我在使用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)
顺便说一下:代码可以正常工作,但它会因某些文件而崩溃
答案 0 :(得分:2)
当您使用ZipFileSystem
时,它会管理存储的路径(请记住,zip中没有文件夹,只有文件,每个文件都由其完整路径名标识,直到选择要压缩的目录的级别,因此它不是zip中的“myTextFile.txt”,它的名称为“/ Folder 1 / Folder 2 / myTextFile.txt”);使用Path
始终使用“标准”文件分隔符(* nix OS)返回名称,但如果您的zip存档使用Windows文件分隔符存储,则它只会失败,这不会如果你使用相同的方法来创建你将用来打开的文件,我的意思是,如果你使用ZipOutputStream
和ZipEntry
压缩文件,然后ZipFileSystem
解压缩它如果你不小心使用文件分隔符,它就会失败。
现在,您可能会说,为什么它只会在您的情况下使用zip中的某些文件失败,那么,当我使用该软件导致此问题时,我正在使用ZipOutputStream
{压缩文件{1}}和ZipEntry
,我“手动”浏览文件树,直到我到达文件,然后添加我使用Path
的zip条目,然后添加到{{1命名要保存的文件的名称,通过连接它来添加分隔符(Path
)。
你可能会说“好的,我理解你在说什么,但是,当你使用第三方软件解压缩存档时,为什么它会起作用?”,这很简单,这是因为它们取代了所有的文件可以在每个文件名中找到的分隔符,以确保它们始终使用相同的文件分隔符,无论是'/'还是'\'......
经验教训:不要混合东西!使用一种方法压缩和解压缩您的存档,或确保所有信息都存储在相同的“名称”下,确保每次都使用完全相同的文件分隔符。
答案 1 :(得分:0)
我知道这是一个旧帖子,但这恰好发生在我身上。 我所有的 zipfiles 都是由第三方创建的,即 Microsoft Word。 我什至无法捕获异常以找出 zip 中的哪个输入文件导致 NoSuchFileException,因为 Java 编译器说:
NoSuchFileException 无法解析为类型