因为实测下来其实
https://www.open-open.com/lib/view/open1381641653833.html
这位写的代码解决不了压缩包里有层级文件夹的问题,
也不太能体现目录重复的错误
于是就按java.nio的风格改写了一下。
public static void unzipContraMultiFile(String zipPath, String unzipPath) {
Path zip = Paths.get(zipPath);
try (ZipInputStream zipInput = new ZipInputStream(Files.newInputStream(zip));
) {
ZipFile zipFile = new ZipFile(zipPath);
ZipEntry entry;
while ((entry = zipInput.getNextEntry()) != null) {
String newFileName = entry.getName();
logger.debug("解压缩{}文件", entry.getName());
Path outPutFile = Paths.get(unzipPath + File.separator + entry.getName()).toAbsolutePath();
Path parent = outPutFile.getParent();
if (parent != null) {
try {
Files.createDirectories(parent);
} catch (FileAlreadyExistsException e) {
logger.error("路径中的父级文件夹中存在同名文件,新文件夹无法创建");
}
}
if (entry.isDirectory()){
if (!Files.exists(outPutFile)) {
Files.createDirectory(outPutFile);
}else{
if (!Files.isDirectory(outPutFile)){
throw new FileAlreadyExistsException("文件夹" + newFileName + "已经存在且为文件格式");
}
}
}else{
if (!Files.exists(outPutFile)) {
Files.createFile(outPutFile);
}else{
if (Files.isDirectory(outPutFile)){
throw new FileAlreadyExistsException("文件" + newFileName + "已经存在且为文件夹格式");
}
}
try (InputStream input = zipFile.getInputStream(entry); // todo: should test first
OutputStream output = Files.newOutputStream(outPutFile);) {
org.apache.commons.io.IOUtils.copy(input, output);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
引用的包如下
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>