0

可能重复:
如何列出 JAR 文件中的文件?

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

4

5 回答 5

1

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

想想看。你能制定一个<pathname>ZIP 文件条目,让你(比如说)cat <pathname>在 Linux 上运行吗?或者在 Windows 上类似的东西?


所以,你可以做什么?

  • 您可以将 ZIP 文件提取到文件系统(使用外部命令最简单),然后参考包含提取条目的文件。您需要花点时间将 ZIP 的目录结构转换为相应的路径名。

  • 您可以使用ZipEntry对象而不是 File 对象……尽管我认为它们仅在 Zip 文件保持打开状态时才有效/可用。

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

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

于 2012-09-03T07:49:03.097 回答
1

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

因此,您可以使用诸如ZipFile、、ZipEntry输入流和子类之类的类从 Zip 中提取文件,然后您可以有一个 File 实例在数组中引用它。

于 2012-09-03T07:18:17.840 回答
0

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

于 2012-09-03T07:15:10.560 回答
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()]);
    }
}

 


 

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

它有很多方法,其中getNextEntry()几乎可以做到:

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

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

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

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

于 2012-09-03T07:17:49.647 回答
0

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

于 2012-09-03T07:19:38.753 回答