功能支持
- 支持标准zip输入流解析文件内容(无需依赖File)
- 支持读取网络url解析zip文件内容
- 支持本地zip文件路径解析文件内容
Maven依赖
cn.hutool
hutool-all
5.4.3
代码示例
package com.liuzhihong.practice.api.impl.utils;
import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.io.*;
import java.nio.charset.Charset;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
@Slf4j
@SuppressWarnings("java:S1118")
public class CustomZipUtil {
private static final Charset DEFAULT_CHARSET = CharsetUtil.defaultCharset();
public static Map unzipToMapByUrl(final String zipUrl, final List filterFileSuffix) {
final InputStream inputStream = URLUtil.getStream(URLUtil.url(zipUrl));
return unzipByStream(inputStream, filterFileSuffix);
}
public static Map unzipToMapByPath(final String path, final List filterFileSuffix) {
final BufferedInputStream inputStream = FileUtil.getInputStream(path);
return unzipByStream(inputStream, filterFileSuffix);
}
public static Map unzipToMapByFile(final File zipFile, final List filterFileSuffix) {
final BufferedInputStream inputStream = FileUtil.getInputStream(zipFile);
return unzipByStream(inputStream, filterFileSuffix);
}
public static Map unzipByStream(final InputStream inputStream, List filterFileSuffix) throws UtilException {
final Map contentMap = Maps.newHashMap();
try (//转换成zip输入流
final ZipInputStream zipStream = new ZipInputStream(inputStream, DEFAULT_CHARSET);
final BufferedInputStream bufferedInputStream = new BufferedInputStream(zipStream)) {
ZipEntry zipEntry;
//循环读取压缩包里面的文件
while (null != (zipEntry = zipStream.getNextEntry())) {
if (!zipEntry.isDirectory()) {
parseFileContent(zipEntry, bufferedInputStream, contentMap, filterFileSuffix);
} else {
log.info("zipEntry is directory : {}", zipEntry.getName());
}
}
} catch (IOException e) {
throw new UtilException(e);
} finally {
IoUtil.close(inputStream);
}
return contentMap;
}
private static void parseFileContent(final ZipEntry zipEntry, final BufferedInputStream bufferedInputStream, final Map contentMap,
final List filterFileSuffix) throws IOException {
final StringBuilder content = new StringBuilder();
final String entryName = zipEntry.getName();
final int lastIndex = StrUtil.lastIndexOfIgnoreCase(entryName, ".");
//文件后缀
final String suffix = StringUtils.substring(entryName, lastIndex + 1);
if (!filterFileSuffix.contains(suffix)) {
final byte[] bytes = new byte[(int) zipEntry.getSize()];
bufferedInputStream.read(bytes, 0, (int) zipEntry.getSize());
//将文件转成流
try (final InputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
final BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(byteArrayInputStream))) {
//读取文件里面的内容
String line;
while ((line = bufferedReader.readLine()) != null) {
content.append(line);
}
contentMap.put(entryName, content.toString());
} catch (final Exception e) {
log.warn("parse inputStream filed.", e);
}
}
}
}