文件名称:org.apache.tools.zip解决解压乱码问题
文件大小:8KB
文件格式:JAVA
更新时间:2018-12-22 04:50:48
解压乱码问题
package com.cliff.common;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
/**
*
* 类名: ZipUtil.java
* 描述:压缩/解压缩zip包处理类
* 创建者:XXX
* 创建日期:2015年5月7日 - 下午1:35:02
* 版本: V0.1
* 修改者:
* 修改日期:
*/
public class ZipUtil {
/**
*
* 功能描述:压缩文件
* 创建者:XXX
* 创建日期: 2015年5月7日 - 下午1:35:18
* 版本: V0.1
* 修改者:
* 修改日期:
* @param directory 指定压缩文件路径 压缩到同目录
* @throws IOException
* void
*/
public static void zip(String directory) throws FileNotFoundException, IOException {
zip("", null, directory);
}
/**
*
* 功能描述:压缩文件
* 创建者:XXX
* 创建日期: 2015年5月7日 - 下午1:36:03
* 版本: V0.1
* 修改者:
* 修改日期:
* @param zipFileName 压缩产生的zip包文件名--带路径,如果为null或空则默认按文件名生产压缩文件名
* @param relativePath 相对路径,默认为空
* @param directory 文件或目录的绝对路径
* void
*/
public static void zip(String zipFileName, String relativePath,
String directory) throws FileNotFoundException, IOException {
String fileName = zipFileName;
if (fileName == null || fileName.trim().equals("")) {
File temp = new File(directory);
if (temp.isDirectory()) {
fileName = directory + ".zip";
} else {
if (directory.indexOf(".") > 0) {
fileName = directory.substring(0, directory.lastIndexOf("."))+ "zip";
} else {
fileName = directory + ".zip";
}
}
}
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(fileName));
try {
zip(zos, relativePath, directory);
} catch (IOException ex) {
throw ex;
} finally {
if (null != zos) {
zos.close();
}
}
}
/**
*
* 功能描述:压缩文件
* 创建者:XXX
* 创建日期: 2015年5月7日 - 下午1:37:55
* 版本: V0.1
* 修改者:
* 修改日期:
* @param zos 压缩输出流
* @param relativePath 相对路径
* @param absolutPath 文件或文件夹绝对路径
* @throws IOException
* void
*/
private static void zip(ZipOutputStream zos, String relativePath,
String absolutPath) throws IOException {
File file = new File(absolutPath);
if (file.isDirectory()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
File tempFile = files[i];
if (tempFile.isDirectory()) {
String newRelativePath = relativePath + tempFile.getName()
+ File.separator;
createZipNode(zos, newRelativePath);
zip(zos, newRelativePath, tempFile.getPath());
} else {
zipFile(zos, tempFile, relativePath);
}
}
} else {
zipFile(zos, file, relativePath);
}
}
/**
*
* 功能描述:压缩文件
* 创建者:XXX
* 创建日期: 2015年5月7日 - 下午1:38:46
* 版本: V0.1
* 修改者:
* 修改日期:
* @param zos 压缩输出流
* @param file 文件对象
* @param relativePath 相对路径
* @throws IOException
* void
*/
private static void zipFile(ZipOutputStream zos, File file,
String relativePath) throws IOException {
ZipEntry entry = new ZipEntry(relativePath + file.getName());
zos.putNextEntry(entry);
InputStream is = null;
try {
is = new FileInputStream(file);
int BUFFERSIZE = 2 << 10;
int length = 0;
byte[] buffer = new byte[BUFFERSIZE];
while ((length = is.read(buffer, 0, BUFFERSIZE)) >= 0) {
zos.write(buffer, 0, length);
}
zos.flush();
zos.closeEntry();
} catch (IOException ex) {
throw ex;
} finally {
if (null != is) {
is.close();
}
}
}
/**
*
* 功能描述:创建目录
* 创建者:XXX
* 创建日期: 2015年5月7日 - 下午1:39:12
* 版本: V0.1
* 修改者:
* 修改日期:
* @param zos zip输出流
* @param relativePath 相对路径
* @throws IOException
* void
*/
private static void createZipNode(ZipOutputStream zos, String relativePath)
throws IOException {
ZipEntry zipEntry = new ZipEntry(relativePath);
zos.putNextEntry(zipEntry);
zos.closeEntry();
}
/**
*
* 功能描述:解压缩文件
* 创建者:XXX
* 创建日期: 2015年5月7日 - 下午1:39:32
* 版本: V0.1
* 修改者:
* 修改日期:
* @param zipFilePath zip文件路径
* @param targetPath 解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下
* void
*/
public static void unzip(String zipFilePath, String targetPath) throws IOException {
InputStream is = null;
FileOutputStream fileOut = null;
File file = null;
ZipFile zipFile = null;
try {
zipFile = new ZipFile(zipFilePath,"GBK");
String directoryPath = "";
if (null == targetPath || "".equals(targetPath)) {
directoryPath = zipFilePath.substring(0, zipFilePath.lastIndexOf("."));
} else {
directoryPath = targetPath;
}
for(Enumeration entries = zipFile.getEntries(); entries.hasMoreElements();){
ZipEntry entry = (ZipEntry)entries.nextElement();
file = new File(directoryPath+"/"+entry.getName());
if(entry.isDirectory()){
file.mkdirs();
}else{
//如果指定文件的目录不存在,则创建之.
File parent = file.getParentFile();
if(!parent.exists()){
parent.mkdirs();
}
is = zipFile.getInputStream(entry);
fileOut = new FileOutputStream(file);
int readLen = 0;
byte[] buffer = new byte[4096];
while ((readLen = is.read(buffer, 0, 4096)) >= 0) {
fileOut.write(buffer, 0, readLen);
}
fileOut.close();
is.close();
}
}
zipFile.close();
} catch (IOException ex) {
throw ex;
} finally {
if(null != zipFile){
zipFile = null;
}
if (null != is) {
is.close();
}
if (null != fileOut) {
fileOut.close();
}
}
}
/**
*
* 功能描述:生产文件 如果文件所在路径不存在则生成路径
* 创建者:XXX
* 创建日期: 2015年5月7日 - 下午1:41:04
* 版本: V0.1
* 修改者:
* 修改日期:
* @param fileName 文件名 带路径
* @param isDirectory 是否为路径
* @return
* File
*/
public static File buildFile(String fileName, boolean isDirectory) {
File target = new File(fileName);
if (isDirectory){
target.mkdirs();
} else {
if (!target.getParentFile().exists()) {
target.getParentFile().mkdirs();
target = new File(target.getAbsolutePath());
}
}
return target;
}
}