ZIPUtils
package cn.anzhongwei.lean.demo.zip;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ZipUtilFileInfo {
private String name;
private String url;
private Boolean Local;
}
package cn.anzhongwei.lean.demo.zip;
import org.apache.commons.lang.ArrayUtils;
import org.apache.pdfbox.io.IOUtils;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.zip.*;
public class ZipUtils2 {
private static final int BUFFER = 256;
public static void main(String[] args) throws IOException {
String hallFilePath = "d:/" + "qwe";
compress(Paths.get(hallFilePath).toString(), hallFilePath + ".zip");
List<ZipUtilFileInfo> downFileInfos = new ArrayList<>();
ZipUtilFileInfo d1 = new ZipUtilFileInfo( "价格导入模板.xlsx", "http://网络地址", false);
ZipUtilFileInfo d2 = new ZipUtilFileInfo( "订单导入_仓储.xlsx", "http://网络地址", false);
downFileInfos.add(d1);
downFileInfos.add(d2);
File zipfile1 = gerenatorZIPFileFromUrl(downFileInfos, "t1.zip");
File zipfile2 = gerenatorZIPFileFromUrl(downFileInfos, "t2.zip");
File zipfile3 = gerenatorZIPFileFromUrl(downFileInfos, "t3.zip");
List<ZipUtilFileInfo> downFileInfos2 = new ArrayList<>();
ZipUtilFileInfo dd1 = new ZipUtilFileInfo( zipfile1.getName(), zipfile1.getAbsolutePath(), true);
ZipUtilFileInfo dd2 = new ZipUtilFileInfo( zipfile2.getName(), zipfile1.getAbsolutePath(), true);
ZipUtilFileInfo dd3 = new ZipUtilFileInfo( zipfile3.getName(), zipfile1.getAbsolutePath(), true);
downFileInfos2.add(dd1);
downFileInfos2.add(dd2);
downFileInfos2.add(dd3);
File ff2 = gerenatorZIPFileFromUrl(downFileInfos2, "tt1.zip");
System.out.println(zipfile1.getAbsolutePath());
InputStream inputStream = new FileInputStream(ff2);
File tempFile = new File("C:\\testFile\\");
if (!tempFile.exists()) {
tempFile.mkdirs();
}
OutputStream os = new FileOutputStream(tempFile.getPath() + File.separator + "shishi.zip");
byte[] bs = new byte[1024];
int len;
while ((len = inputStream.read(bs)) != -1) {
os.write(bs, 0, len);
}
}
//文件或目录打包成zip
public static void compress(String fromPath, String toPath) throws IOException {
File fromFile = new File(fromPath);
File toFile = new File(toPath);
if (!fromFile.exists()) {
throw new RuntimeException(fromPath + "不存在!");
}
try (FileOutputStream outputStream = new FileOutputStream(toFile);
CheckedOutputStream checkedOutputStream = new CheckedOutputStream(outputStream, new CRC32());
ZipOutputStream zipOutputStream = new ZipOutputStream(checkedOutputStream)) {
String baseDir = "";
compress(fromFile, zipOutputStream, baseDir);
}
}
private static void compress(File file, ZipOutputStream zipOut, String baseDir) throws IOException {
if (file.isDirectory()) {
compressDirectory(file, zipOut, baseDir);
} else {
compressFile(file, zipOut, baseDir);
}
}
private static void compressFile(File file, ZipOutputStream zipOut, String baseDir) throws IOException {
if (!file.exists()) {
return;
}
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {
ZipEntry entry = new ZipEntry(baseDir + file.getName());
zipOut.putNextEntry(entry);
int count;
byte[] data = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
zipOut.write(data, 0, count);
}
}
}
private static void compressDirectory(File dir, ZipOutputStream zipOut, String baseDir) throws IOException {
File[] files = dir.listFiles();
if (files != null && ArrayUtils.isNotEmpty(files)) {
for (File file : files) {
compress(file, zipOut, baseDir + dir.getName() + File.separator);
}
}
}
private static File gerenatorZIPFileFromUrl(List<ZipUtilFileInfo> downFileInfos, String zipFileName) {
try {
File zipFile = File.createTempFile(zipFileName, ".zip");
FileOutputStream f = new FileOutputStream(zipFile);
CheckedOutputStream csum = new CheckedOutputStream(f, new Adler32());
ZipOutputStream zos = new ZipOutputStream(csum);
for (ZipUtilFileInfo downFileInfo : downFileInfos) {
InputStream inputStream;
if (Objects.isNull(downFileInfo.getLocal())) {
throw new RuntimeException("url类型未指定是否本地,请检查代码");
}
if (downFileInfo.getLocal()) {
inputStream = new FileInputStream(downFileInfo.getUrl());
} else {
inputStream = getStreamByUrl(downFileInfo.getUrl());
}
zos.putNextEntry(new ZipEntry(downFileInfo.getName()));
int bytesRead = 0;
// 向压缩文件中输出数据
while((bytesRead = inputStream.read()) != -1){
zos.write(bytesRead);
}
inputStream.close();
zos.closeEntry();
}
zos.close();
return zipFile;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static InputStream getStreamByUrl(String strUrl){
HttpURLConnection conn = null;
try {
URL url = new URL(strUrl);
conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(20 * 1000);
final ByteArrayOutputStream output = new ByteArrayOutputStream();
IOUtils.copy(conn.getInputStream(),output);
return new ByteArrayInputStream(output.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}finally {
try{
if (conn != null) {
conn.disconnect();
}
}catch (Exception e){
e.printStackTrace();
}
}
return null;
}
}