2012-08-02 46 views
0

我正在研究一个需要我访问多个嵌入式zip文件和目录中的文件的java项目。如何在不创建任何新文件的情况下访问zip文件目录中的文件?

例如,archive1.zip/archive1/archive2.zip/archive2/directory1/file_that_I_need.txt。

如果每个zip文件都被提取出来,它会立即列出它的内容,但是里面有一个包含所有内容的文件夹。

我在网上找到的例子处理zip文件,当解压缩时,它包含他们需要访问的文件,但我找不到在zip文件的目录中访问文件的任何问题。任何关于此的建议都会很棒。

谢谢!

+0

没有区别。您可以在ZIP文件中提供可包含目录的路径。 – 2012-08-02 16:53:08

+0

我不知道我明白这一点。你的意思是这样的代码:zis = ZipInputStream(new FileInputStream(file));会工作?假设File file = new File(“archive1.zip/archive1/archive2.zip”)。 – joshualan 2012-08-02 17:17:28

+0

从拉链内装入拉链有点疯狂,但你可以做到。您需要浏览archive1.zip的条目,直到找到archive2.zip的InputStream。使用ZipInputStream,你需要扫描它实际需要的文件。 – 2012-08-02 17:26:33

回答

1

鉴于禁止创建新文件,您几乎坚持使用ZipInputStream。当找到与嵌入式归档相对应的ZipEntry时,您将读取它的流以查找实际文件。您可以根据需要通过尽可能多的档案级递归进行。

如果您想要处理单个文件,这可以正常工作。但是,重新读取多个文件的档案可能很昂贵。一个更好的解决方案是至少打开外部存档作为ZipFile,这是内存映射实际文件。

如果您可以将包含的档案提取到一个临时目录中,并将它们打开为ZipFile s,那么您可能会看到速度大幅提升(只要您从每个嵌入式档案中提取多个文件)。

+0

谢谢,你的第一段看起来像我想去的方式。那将如何呢?

会编写,如:
ZipInputStream zipInputStream =新ZipInputStream(新的FileInputStream( “archive1.zip”);

//在此处插入环 的ZipEntry的ZipEntry = zipInputStream.getNextEntry();

将getNextEntry( )递归地进入目录以及 – joshualan 2012-08-02 17:06:11

+0

对不起,我在这里是新的,格式是可怕的。实质上,将使用函数zipInputStream.getNextEntry()递归地返回嵌入式目录中的文件?? – joshualan 2012-08-02 17:13:57

+0

我会写一个函数' ZipInputStream findFile(ZipInputStream in,String name)'迭代'in'中的所有条目,并返回该条目的流tches'name'。你可以事先分开你的路径(在这种情况下,它实际上是迭代的),或者在方法内部分解它(在这种情况下它是递归的)。 – parsifal 2012-08-02 18:06:53

0

您可能还会看到http://truezip.java.net/我已经使用了它的一个较旧版本,它比内置于Java的支持功能强大得多。我认为还有一个Apache Commons库用于从嵌套的归档结构中读取文件。

相关问题