作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设我有一个 zip 文件 MyZipFile.zip
,其中包含 (1) 文件 MyFile.txt
和 (2) 文件夹 MyFolder
其中包含一个文件 MyFileInMyFolder.txt
,即如下内容:
MyZipFile.zip
|->MyFile.txt
|->MyFolder
|->MyFileInMyFolder.txt
我想解压缩这个 zip 存档。我能够在网上搜索到的最常见的代码示例使用 ZipInputStream
类,有点像粘贴在这个问题底部的代码。然而,使用上面的示例,问题在于它将创建 MyFolder
但不会解压缩 MyFolder
的内容。任何人都知道是否可以使用 ZipInputStream
或任何其他方式解压缩 zip 存档中文件夹的内容?
public static boolean unzip(File sourceZipFile, File targetFolder)
{
// pre-stuff
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(sourceZipFile));
ZipEntry zipEntry = null;
while ((zipEntry = zipInputStream.getNextEntry()) != null)
{
File zipEntryFile = new File(targetFolder, zipEntry.getName());
if (zipEntry.isDirectory())
{
if (!zipEntryFile.exists() && !zipEntryFile.mkdirs())
return false;
}
else
{
FileOutputStream fileOutputStream = new FileOutputStream(zipEntryFile);
byte buffer[] = new byte[1024];
int count;
while ((count = zipInputStream.read(buffer, 0, buffer.length)) != -1)
fileOutputStream.write(buffer, 0, count);
fileOutputStream.flush();
fileOutputStream.close();
zipInputStream.closeEntry();
}
}
zipInputStream.close();
// post-stuff
}
最佳答案
试试这个:
ZipInputStream zis = null;
try {
zis = new ZipInputStream(new FileInputStream(zipFilePath));
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
// Create a file on HDD in the destinationPath directory
// destinationPath is a "root" folder, where you want to extract your ZIP file
File entryFile = new File(destinationPath, entry.getName());
if (entry.isDirectory()) {
if (entryFile.exists()) {
logger.log(Level.WARNING, "Directory {0} already exists!", entryFile);
} else {
entryFile.mkdirs();
}
} else {
// Make sure all folders exists (they should, but the safer, the better ;-))
if (entryFile.getParentFile() != null && !entryFile.getParentFile().exists()) {
entryFile.getParentFile().mkdirs();
}
// Create file on disk...
if (!entryFile.exists()) {
entryFile.createNewFile();
}
// and rewrite data from stream
OutputStream os = null;
try {
os = new FileOutputStream(entryFile);
IOUtils.copy(zis, os);
} finally {
IOUtils.closeQuietly(os);
}
}
}
} finally {
IOUtils.closeQuietly(zis);
}
请注意,它使用 Apache Commons IO处理流复制/关闭。
关于java - 如何解压缩具有子目录的 zip 存档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10849321/
我是一名优秀的程序员,十分优秀!