如何在 Java 中使用 ZipFile 类递归打开所有文件,包括文件夹下的文件
Posted
技术标签:
【中文标题】如何在 Java 中使用 ZipFile 类递归打开所有文件,包括文件夹下的文件【英文标题】:How to use ZipFile Class in Java to recursively open all files including those under Folders 【发布时间】:2013-09-10 04:26:03 【问题描述】:我正在用 Java 创建一个方法来打开 zip 文件并动态处理 zip 中的 Excel 文件。我在 Java 中使用 API ZipFile,并希望按原样处理内存中的 zipfile,而不将其提取到文件系统中。
到目前为止,我能够遍历 zip 文件,但在列出 zip 文件目录下的文件时遇到问题。 Excel 文件可以位于 zip 文件的文件夹中。 以下是我当前的代码,在我遇到问题的部分中有注释。 非常感谢任何帮助:)
public static void main(String[] args)
try
ZipFile zip = new ZipFile(new File("C:\\sample.zip"));
for (Enumeration e = zip.entries(); e.hasMoreElements(); )
ZipEntry entry = (ZipEntry) e.nextElement();
String currentEntry = entry.getName();
if (entry.isDirectory())
/*I do not know how to get the files underneath the directory
so that I can process them */
InputStream is = zip.getInputStream(entry);
else
InputStream is = zip.getInputStream(entry);
catch (ZipException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
【问题讨论】:
【参考方案1】:Zip 条目实际上没有任何关于文件夹或目录的概念,它们都存在于 zip 文件的同一个概念根目录中。允许文件组织成“文件夹”的东西是 zip 条目的名称。
一个 zip 条目被认为是一个目录,只是因为它实际上不包含任何压缩字节并且被标记为这样。
目录条目是一个标记,让您有机会构建使用相同路径前缀的文件需要提取到的路径。
这意味着,您不需要真正关心目录条目,除了可能需要创建输出文件夹之外的任何后续文件
【讨论】:
【参考方案2】:请查看here和here
public static void unzip(final ZipFile zipfile, final File directory)
throws IOException
final Enumeration<? extends ZipEntry> entries = zipfile.entries();
while (entries.hasMoreElements())
final ZipEntry entry = entries.nextElement();
final File file = file(directory, entry);
if (entry.isDirectory())
continue;
final InputStream input = zipfile.getInputStream(entry);
try
// copy bytes from input to file
finally
input.close();
protected static File file(final File root, final ZipEntry entry)
throws IOException
final File file = new File(root, entry.getName());
File parent = file;
if (!entry.isDirectory())
final String name = entry.getName();
final int index = name.lastIndexOf('/');
if (index != -1)
parent = new File(root, name.substring(0, index));
if (parent != null && !parent.isDirectory() && !parent.mkdirs())
throw new IOException(
"failed to create a directory: " + parent.getPath());
return file;
【讨论】:
以上是关于如何在 Java 中使用 ZipFile 类递归打开所有文件,包括文件夹下的文件的主要内容,如果未能解决你的问题,请参考以下文章
使用脚本内的 ZipFile java 类读取 zip 文件内容
System.IO.Compression.ZipFile.CreateFromDirectory - 在 Mac 上打开时没有文件夹结构