你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