你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
實現。
那麼...... Java 7和Java 8都是如此?你實際使用哪一個? – bcsb1001 2014-10-06 15:28:03
@ bcsb1001忘記刪除標籤,修復 – jamp 2014-10-06 15:35:33
嘗試直接使用'new ZipFileSystemProvider()。newFileSystem('*另一個zip *內的路徑,emptyMap())'打開zip文件系統,您將得到一個'UnsupportedOperationException'。 – Holger 2014-10-07 18:47:06