这主要是问题,如何将zip文件中的文件作为文件数组
答案 0 :(得分:1)
除了从zip中提取文件外,我不知道直接在zip文件中引用文件的URI方案。因此,您将以String
而不是File
个实例的文件名列表结束。
所以你可以使用像ZipFile
,ZipEntry
这样的类,输入流和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_Userspace加http://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