2013-02-01 67 views
1

我發現了一個例外,而使用Java NIO走一個zip文件的VFS(虛擬文件系統)的文件樹走一個zip中的文件樹,這裏是我的代碼:nosuchfileexception同時使用Java NIO

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) 

BTW:代碼的工作,但它與某些文件

+0

有沒有對它失敗的文件有任何模式?總是xlsm?在zip文件中使用的任何密碼? –

+0

不,我至少可以看到... – Ordiel

+0

你有沒有想過這個?我也很難過。來自http://stackoverflow.com/questions/14436032/why-is-java-7-files-walkfiletree-throwing-exception-on-encountering-a-tar-file-o評論我目前的猜測是它調用某種本地窗口getAttributes *錯誤*或者什麼... jdk bug?剛剛在Windows上的JDK錯誤?你在窗戶上嗎? – rogerdpack

回答

2

崩潰,當您使用的是ZipFileSystem它管理的路徑,因爲它們存儲在哪裏(請記住,zip中沒有文件夾,只有文件,每個文件都由其完整路徑名標識,直到選定要壓縮的目錄級別,因此它不是zip文件中的「myTextFile.txt」命名爲「/ Folder 1/Folder 2/myTextFile.txt」);使用Path總是使用「標準」文件分隔符(* nix OS)返回名稱,但是如果您的zip歸檔文件是使用windows文件分隔符存儲的,則它會失敗,如果使用相同的方法創建,則不會發生你的文件,你將用來打開,我的意思是,如果你使用ZipOutputStreamZipEntry來壓縮文件,然後ZipFileSystem來解壓縮它,如果你不小心使用文件分隔符,它會失敗。現在

,你可能會說,爲什麼它在你的情況下,壓縮內部的某些文件,只有失敗的話,那麼,當我是用軟件工作造成這個問題,我是用ZipOutputStreamZipEntry,並且Path荏苒文件,我「手動」瀏覽文件樹,直到我到達一個文件,並添加一個zip條目我正在使用Path,然後在String名稱中添加要保存的文件的名稱並添加一個分隔符(+"/"+) 。

你可能會說:「好吧,我明白你在說什麼,但是,爲什麼在你使用第三方軟件解壓檔案時它工作?」,這很容易,這是因爲它們取代了所有的文件分隔符的可在每個文件名查找,以確保他們使用的是百達相同的文件分隔符,無論是「/」或「\」 ...

經驗教訓:不要混用東西!使用單一方法來壓縮和解壓縮您的壓縮文件,或者確保所有信息都以相同的「名稱」存儲,確保您每次都使用完全相同的文件分隔符。

+0

我正在做'Files.walk(root,1).filter(...)。findAny()'(其中'root'是一個來自ZIP文件系統)並得到'java.io.UncheckedIOException:java.nio.file.NoSuchFileException'。事實證明,原因是ZIP文件中文件名中的反斜槓。這個問題和答案真的幫了我 - 在問了四年之後:) – dave