2014-10-06 65 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

相关问题