如何将zip文件作为Files []数组获取?

时间:2012-09-03 07:10:51

标签: java

  

可能重复:
  How do I list the files inside a JAR file?

这主要是问题,如何将zip文件中的文件作为文件数组

5 个答案:

答案 0 :(得分:1)

除了从zip中提取文件外,我不知道直接在zip文件中引用文件的URI方案。因此,您将以String而不是File个实例的文件名列表结束。

所以你可以使用像ZipFileZipEntry这样的类,输入流和son来从Zip中提取文件,然后你可以让一个File实例在一个数组中引用它。

答案 1 :(得分:1)

简单的答案是,你做不到。 File本质上是主机操作系统文件系统中对象的抽象文件系统路径。但ZIP文件中的文件不是文件系统中的对象,因此没有文件系统路径。

想一想。你能为ZIP文件条目制定一个<pathname>,允许你(比方说)在Linux上运行cat <pathname>吗?或类似Windows上的类似内容?


那你能做什么?

  • 您可以将ZIP文件解压缩到文件系统(使用外部命令最简单),然后参考包含提取的条目的文件。您需要稍微改变一下,将ZIP的目录结构转换为对应的路径名。

  • 您可以使用ZipEntry个对象而不是File对象...虽然我认为它们只有在Zip文件保持打开状态时才有效/可用。

  • 您可以找到...或者编写一个Java 7风格的FileSystem实现,它允许您将ZIP文件视为文件系统。但是这些API不使用File个对象,等等。

  • 如果您的操作系统支持它,您可以将ZIP文件“挂载”为文件系统,然后File将起作用。例如:http://en.wikipedia.org/wiki/Filesystem_in_Userspacehttp://code.google.com/p/fuse-zip/

答案 2 :(得分:0)

您可能需要查看具有解压缩文件实用程序的java.util.zip包。

答案 3 :(得分:0)

更新

要获取zip中的文件数组,必须首先将它们提取到临时位置:

import java.util.zip.*;
import java.io.File;
import java.util.ArrayList;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.io.IOException;

public class ZipFileExtractor {

    public static void main(String[] args) {
        File[] zipFiles = ZipFileExtractor.getFileArray("archive.zip");
        System.out.println(zipFiles.length);
    }

    public static File[] getFileArray(String archiveFileName) {

        ArrayList<File> zipArrayList = new ArrayList<File>();

        try {

            ZipFile zFile = new ZipFile(archiveFileName);

            for (Enumeration<? extends ZipEntry> e = zFile.entries(); e.hasMoreElements(); ) {

                ZipEntry zEntry = e.nextElement();

                InputStream in = zFile.getInputStream(zEntry);

                File temp = File.createTempFile(zFile.getName(), null);
                temp.deleteOnExit();

                FileOutputStream out = new FileOutputStream(temp);

                byte[] buffer = new byte[1024];
                while (in.read(buffer) != -1) {
                    out.write(buffer);
                }

                zipArrayList.add(temp);
            }

        } catch (IOException e) {

        }

        return zipArrayList.toArray(new File[zipArrayList.size()]);
    }
}


java.util.zip包中有一个名为ZipInputStream的API类。

它有很多方法,其中getNextEntry()几乎就是这样:

ArrayList<ZipEntry> zipArrayList = new ArrayList<ZipEntry>();

ZipInputStream zis = ZipInputStream(new FileInputStream("archive.zip"));

while ((ZipEntry ze = zis.getNextEntry()) != null) {
   zipArrayList.add(ze.getName());
}

我还没有尝试编译上面的代码,所以它可能有一些问题,但我希望这个想法很明确。

答案 4 :(得分:0)

另请查看Apache Commons Compress api有一些关于如何入门的示例http://commons.apache.org/compress/examples.html