2014-10-06 87 views
2

裏面這就是我想要做的事:得到一個jar文件系統的另一個罐子

FileSystem fs1 = FileSystems.newFileSystem(Paths.get("f1.jar"), null); 
FileSystem fs2 = FileSystems.newFileSystem(fs1.getPath("/f2.jar"), null); 

,但我得到FileSystems.newFileSystem()第二行拋出java.nio.file.ProviderNotFoundException

我在做什麼錯?

謝謝!

+1

那麼...... Java 7和Java 8都是如此?你實際使用哪一個? – bcsb1001 2014-10-06 15:28:03

+0

@ bcsb1001忘記刪除標籤,修復 – jamp 2014-10-06 15:35:33

+0

嘗試直接使用'new ZipFileSystemProvider()。newFileSystem('*另一個zip *內的路徑,emptyMap())'打開zip文件系統,您將得到一個'UnsupportedOperationException'。 – Holger 2014-10-07 18:47:06

回答

2

have to首先提取嵌套的jar。

編輯: 在oracle論壇上的答案沒有給出明確的理由,爲什麼你必須先提取jar。

下面是引用from拉金德拉Gutupalli的博客(com.sun.nio.zipfs的作者):

讓我們假設我們有一個嵌套的內部拉鍊的JAR文件。以下程序打印嵌套jarCompress1.jar文件內的MANIFEST.MF文件的內容。

import java.io.BufferedInputStream; 
import java.nio.file.*; 
import java.util.HashMap; 
import java.util.Map; 

public class ReadEntry { 

    public static void main(String... args) throws Exception { 
     Path zipfile = Path.get("c:/zips/zip1.zip"); 
     Map<String, String> env = new HashMap(); 
     FileSystem manager = FileSystems.newFileSystem(zipfile, env,null); 
     Path path = manager.getPath("/jarCompress1.jar/META-INF/MANIFEST.MF"); 
     System.out.println("Reading input stream"); 
     BufferedInputStream bis = new BufferedInputStream(path.newInputStream()); 
     int ch = -1; 
     while ((ch = bis.read()) != -1) { 
      System.out.print((char) ch); 
     } 
    } 
} 

而另一one

重要的一點要注意這裏,zip文件路徑可以擴展到文件的路徑名嵌套的拉鍊或罐子。例如,/ home/userA/zipfile.zip /DirA/dirB/jarFile.jar/META-INF/MANIFEST.MF在Zip文件「/home/userA/zipfile.zip」中訪問jar文件「jarFile.jar」。

我無法複製聲稱的行爲。下面的代碼:

try (FileSystem fs1 = FileSystems.newFileSystem(Paths.get("f1.zip"), null)) { 
    Path path = fs1.getPath("/f2.zip/test.txt"); 
    Files.lines(path).forEach(System.out::println); 
} 

給出例外

Exception in thread "main" java.nio.file.NoSuchFileException: f2.zip/test.txt 
    at com.sun.nio.zipfs.ZipFileSystem.newInputStream(ZipFileSystem.java:544) 
    at com.sun.nio.zipfs.ZipPath.newInputStream(ZipPath.java:645) 
    at com.sun.nio.zipfs.ZipFileSystemProvider.newInputStream(ZipFileSystemProvider.java:278) 
    at java.nio.file.Files.newInputStream(Files.java:152) 
    at java.nio.file.Files.newBufferedReader(Files.java:2781) 
    at java.nio.file.Files.lines(Files.java:3741) 
    at java.nio.file.Files.lines(Files.java:3782) 

可能會有人證實,這是在我的代碼中的錯誤錯誤或點。

同時回到原來的問題。由於沒有FileSystemProvider(查看newFileSystem方法的源代碼)可以從ZipPath創建FileSystem實例,因此無法在zip(jar)中創建FileSystem。因此,您必須從外部zip中提取選項或編寫自己的FileSystemProvider實現。

+0

請在您的回答中總結鏈接的內容。如果鏈接失效,這個答案不會有幫助。 – 2014-10-06 16:26:14

+1

您所指的博客是過時的。這是在Java 7推出幾年前寫的,在幾個問題上是錯誤的,例如Scheme是'Jar'而不是'Zip',並且zipfs不是隻讀的。所以這就像博客描述了一個完全不同的軟件...... – Holger 2014-10-07 18:46:32

+0

首先'ZipFileSystemProvider'擴展'@since 1.7'的'FileSystemProvider'。其次查看[JSR203]的階段日期(https://jcp.org/en/jsr/detail?id=203)。第三,拉鍊和罐子基本上是一樣的。 – user2418306 2014-10-07 19:01:35

相關問題