Java解压zip文件
0
代码如下:
/**
* 解压文件
* @param filePath 源文件
* @param targetPath 解压后文件
* @param delete 解压是否删除原文件
*/
public static void unzip(String filePath, String targetPath, boolean delete) {
if(StringUtils.isEmpty(targetPath) || StringUtils.isEmpty(filePath))
return;
File file = new File(filePath);
if(!file.exists() || !file.isFile())
return;
if(!targetPath.endsWith("/"))
targetPath += "/";
Tools.createFile(targetPath, true);
InputStream is = null;
ZipInputStream zis = null;
try {
is = new FileInputStream(filePath);
zis = new ZipInputStream(is, Charset.forName("UTF-8"));
java.util.zip.ZipEntry entry = null;
while((entry = zis.getNextEntry()) != null) {
String extPath = targetPath + entry.getName();
Tools.createFile(extPath, entry.isDirectory()); // 创建文件或文件夹,代码见后面
if(entry.isDirectory()) // 如果不是文件不需要后面操作
continue;
byte[] data = new byte[read_buffer];
int index = 0;
OutputStream os = null;
try {
os = new FileOutputStream(new File(extPath));
while((index = zis.read(data)) != -1) {
os.write(data, 0, index);
}
os.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(os);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(is);
IOUtils.closeQuietly(zis);
}
if(delete)
file.delete();
}
上面的创建文件路径方法:
/**
* 创建文件夹
* @param path 文件地址
* @param isDirectory 是否是文件夹
*/
public static final void createFile(String path, boolean isDirectory) {
if(StringUtils.isNotEmpty(path)) {
File file = new File(path);
if(!file.exists()) {
if(isDirectory) {
file.mkdirs();
} else {
if(!file.getParentFile().exists())
file.getParentFile().mkdirs();
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
不过遇到中文是会有问题,可以使用ant.jar
解决,完整DEMO:
package com.acgist.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* 使用时请添加ant-x.x.x.jar
* 解决linux乱码
*/
public class ZipUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(ZipUtils.class);
/**
* file打包
*
* @param files 需要压缩的文件数组
* @param output 输出流,使用完毕会关闭
*/
private final static void zip(File[] files, OutputStream output) {
if(ArrayUtils.isEmpty(files) || output == null) {
return;
}
try(ZipOutputStream zipOutput = new ZipOutputStream(output);) {
zipOutput.setEncoding("UTF-8");
for (File file : files) {
if(file != null) {
addZip(zipOutput, file);
}
}
} catch (Exception e) {
LOGGER.error("Zip打包异常", e);
}
}
/**
* 添加压缩文件
*/
private static final void addZip(ZipOutputStream zipOutput, File file) {
try(InputStream input = new FileInputStream(file);) {
ZipEntry entry = new ZipEntry(file.getName());
entry.setUnixMode(644); // linux乱码
zipOutput.putNextEntry(entry);
int len;
byte[] bytes = new byte[1024];
while ((len = input.read(bytes)) != -1) {
zipOutput.write(bytes, 0, len);
}
zipOutput.flush();
} catch (IOException e) {
LOGGER.error("Zip打包异常", e);
}
}
/**
* 压缩文件
*
* @param file 需要压缩的文件
* @param out 输出流,自动关闭
*/
public final static void zip(File file, OutputStream out) {
if(file == null || out == null) {
return;
}
File[] files = new File[1];
files[0] = file;
zip(files, out);
}
/**
* 压缩文件
*
* @param file 需要压缩的文件
* @param outPath 输出地址
*
* @return 输出地址
*/
public final static String zip(File file, String outPath) {
if(file == null || StringUtils.isEmpty(outPath)) {
return null;
}
try(OutputStream output = new FileOutputStream(new File(outPath));) {
CommonUtils.mkdirs(file, true);
zip(file, output);
} catch (IOException e) {
LOGGER.error("文件找不到", e);
}
return outPath;
}
/**
* 压缩文件
*
* @param files 需要压缩的文件数组
* @param outPath 输出地址
*
* @return 输出地址
*/
public final static String zip(File[] files, String outPath) {
if(ArrayUtils.isEmpty(files) || StringUtils.isEmpty(outPath)) {
return null;
}
try(OutputStream out = new FileOutputStream(new File(outPath))) {
CommonUtils.mkdirs(outPath, true);
zip(files, out);
} catch (IOException e) {
LOGGER.error("文件找不到", e);
}
return outPath;
}
/**
* 压缩文件
*
* @param filePath 压缩文件地址
* @param outPath 输出文件地址
*
* @return 压缩文件地址
*/
public final static String zip(String filePath, String outPath) {
if(StringUtils.isEmpty(filePath) || StringUtils.isEmpty(outPath)) {
return null;
}
return zip(new File(filePath), outPath);
}
/**
* 压缩文件
*
* @param filePaths 压缩文件地址的数组
* @param outPath 输出文件地址
*
* @return 压缩文件地址
*/
public final static String zip(String[] filePaths, String outPath) {
if(ArrayUtils.isEmpty(filePaths) || StringUtils.isEmpty(outPath)) {
return null;
}
File[] files = new File[filePaths.length];
for (int i = 0; i < filePaths.length; i++) {
files[i] = new File(filePaths[i]);
}
return zip(files, outPath);
}
/**
* 压缩文件
*
* @param filePaths 压缩文件地址的数组
* @param output 输出流
*/
public final static void zip(String[] filePaths, OutputStream output) {
if(ArrayUtils.isEmpty(filePaths) || output == null) {
return;
}
File[] files = new File[filePaths.length];
for (int i = 0; i < filePaths.length; i++) {
files[i] = new File(filePaths[i]);
}
zip(files, output);
}
/**
* 压缩文件
*
* @param filePath 压缩文件地址
* @param output 输出流
*/
public final static void zip(String filePath, OutputStream output) {
if(StringUtils.isEmpty(filePath) || output == null) {
return;
}
zip(new File(filePath), output);
}
}