ZipUtils
package com.imddysc.study.utils.utils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ZipUtils {
private static final Logger logger = LoggerFactory.getLogger(ZipUtils.class);
/** zip压缩文件,传入文件夹路径,文件名, 输出到文件输出的zip文件流中 */
private static void ZipFiles(String folderString, String fileString, ZipOutputStream zipOutputStream) throws Exception {
if (zipOutputStream == null) {
return;
}
File file = new File(folderString + fileString);
if (file.isFile()) {
ZipEntry zipEntry = new ZipEntry(fileString);
FileInputStream fileInputStream = new FileInputStream(file);
zipOutputStream.putNextEntry(zipEntry);
int len;
byte[] buffer = new byte[4096];
while ((len = fileInputStream.read(buffer)) != -1) {
zipOutputStream.write(buffer, 0, len);
}
zipOutputStream.closeEntry();
} else {
// 文件夹
String fileList[] = file.list();
// 没有子文件和压缩
if (fileList.length <= 0) {
ZipEntry zipEntry = new ZipEntry(fileString + File.separator);
zipOutputStream.putNextEntry(zipEntry);
zipOutputStream.closeEntry();
}
// 子文件和递归
for (int i = 0; i < fileList.length; i++) {
ZipFiles(folderString, fileString + File.separator + fileList[i], zipOutputStream);
}
}
}
/** inputStream转outputStream */
private static ByteArrayOutputStream parseInputStreamToOutputStream(final InputStream in) throws Exception {
final ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
int ch;
while ((ch = in.read()) != -1) {
swapStream.write(ch);
}
return swapStream;
}
/** outputStream转inputStream */
private static ByteArrayInputStream parseOutputStreamToInputStream(final OutputStream out) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos = (ByteArrayOutputStream) out;
final ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray());
return swapStream;
}
/** zip生产压缩文件,传入文件夹和文件名,生成指定的zip文件 */
public static void zip(String srcFileString, String zipFileString) throws Exception {
// 创建ZIP
ZipOutputStream outZip = new ZipOutputStream(new FileOutputStream(zipFileString));
// 创建文件
File file = new File(srcFileString);
// 压缩
ZipFiles(file.getParent() + File.separator, file.getName(), outZip);
// 完成和关闭
outZip.finish();
outZip.close();
}
/** 根据传入zip文件名和内部的文件,获取压缩文件内文件的流 */
public static InputStream unzipGetInputStreamForName(String zipFileString, String fileString) throws Exception {
ZipFile zipFile = new ZipFile(zipFileString);
ZipEntry zipEntry = zipFile.getEntry(fileString);
return zipFile.getInputStream(zipEntry);
}
public static void unzip(String zipFileString, String outPathString) throws Exception {
ZipInputStream inZip = new ZipInputStream(new FileInputStream(zipFileString));
ZipEntry zipEntry;
String szName = "";
while ((zipEntry = inZip.getNextEntry()) != null) {
szName = zipEntry.getName();
if (zipEntry.isDirectory()) {
// 获取部件的文件夹名
szName = szName.substring(0, szName.length() - 1);
File folder = new File(outPathString + File.separator + szName);
folder.mkdirs();
} else {
File file = new File(outPathString + File.separator + szName);
if (!file.exists()) {
file.getParentFile().mkdirs();
file.createNewFile();
}
// 获取文件的输出流
FileOutputStream out = new FileOutputStream(file);
int len;
byte[] buffer = new byte[1024];
// 读取(字节)字节到缓冲区
while ((len = inZip.read(buffer)) != -1) {
// 从缓冲区(0)位置写入(字节)字节
out.write(buffer, 0, len);
out.flush();
}
out.close();
}
}
inZip.close();
}
public static void unzipForName(String zipFileString, String fileString, String targetFileString) throws Exception {
ZipFile zipFile = new ZipFile(zipFileString);
ZipEntry zipEntry = zipFile.getEntry(fileString);
FileOutputStream fileOutputStream = new FileOutputStream(targetFileString);
fileOutputStream.write( parseInputStreamToOutputStream(zipFile.getInputStream(zipEntry)).toByteArray());
}
public static void main(String[] args) throws Exception {
logger.info("111");
ZipUtils.zip("D:\\个人文档", "D:\\个人文档.zip");
ZipUtils.unzip("D:\\个人文档.zip", "D:\\testdir\\");
ZipUtils.unzipForName("D:\\个人文档.zip", "个人文档\\2021Q1目标.xlsx", "D:\\testdir\\111.xlsx");
}
}