可能重复:
如何列出 JAR 文件中的文件?
这主要是问题,如何将 zip 文件中的文件作为文件数组获取
简单的答案是你不能。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/
除了从 zip 中提取文件之外,我不知道直接在 zip 文件中引用文件的 URI 方案。因此,您将以文件名列表作为String
非File
实例结束。
因此,您可以使用诸如ZipFile
、、ZipEntry
输入流和子类之类的类从 Zip 中提取文件,然后您可以有一个 File 实例在数组中引用它。
您可能想查看java.util.zip
具有解压缩文件实用程序的软件包。
要在 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());
}
我没有尝试编译上面的代码,所以它可能有一些问题,但我希望这个想法很清楚。
另请查看 Apache Commons Compress api,其中有一些关于如何开始的示例http://commons.apache.org/compress/examples.html