- 按目录结构压缩文件
- 如果是空目录,也要进行压缩
@Log4j2
public class FileCompressUtil {
public static void main(String[] args) {
write("C:\Users\Desktop\测试数据文件\magic-oss.jar", "C:\Users\Desktop\测试数据文件\100.zip");
}
public static void write(String srcPath, String descFile) {
try (
final OutputStream outputStream = Files.newOutputStream(Paths.get(descFile));
final ZipOutputStream zos = new ZipOutputStream(outputStream)
) {
final Path path = Paths.get(srcPath);
if (Files.notExists(path)) {
throw new BusinessException("文件路径不存在!");
}
writeIO(path, zos, path.getFileName().toString());
} catch (Exception e) {
log.error("FileCompressUtil.writeIO...e=", e);
}
}
public static void write(String srcPath, HttpServletResponse response) {
try (
final ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())
) {
final Path path = Paths.get(srcPath);
if (Files.notExists(path)) {
throw new BusinessException("文件路径不存在!");
}
writeIO(path, zos, path.getFileName().toString());
} catch (Exception e) {
log.error("FileCompressUtil.writeIO...e=", e);
}
}
@SneakyThrows
private static void writeIO(Path path, ZipOutputStream zos, String fileName) {
if (Files.isDirectory(path)) {
final List list = Files.list(path).collect(Collectors.toList());
if (CollectionUtils.isEmpty(list)) {
// 写入空文件夹
zos.putNextEntry(new ZipEntry(fileName + "/"));
}
for (Path p : list) {
writeIO(p, zos, fileName + "/" + p.getFileName().toString());
}
} else {
try (
final BufferedInputStream bis = new BufferedInputStream(Files.newInputStream(path));
) {
int len;
byte[] b = new byte[8192];
zos.putNextEntry(new ZipEntry(fileName));
while ((len = bis.read(b)) != -1) {
zos.write(b, 0, len);
}
} catch (Exception e) {
log.error("FileCompressUtil.writeIO...e=", e);
}
}
}
}