码迷,mamicode.com
首页 > 编程语言 > 详细

java压缩/解压缩zip格式文件

时间:2017-12-11 14:18:51      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:build   next   redo   post   ring   创建   nts   trim   buffer   

1package com.resoft.util;

3import java.io.BufferedOutputStream;

4import java.io.File;

5import java.io.FileInputStream;

6import java.io.FileNotFoundException;

7import java.io.FileOutputStream;

8import java.io.IOException;

9import java.io.InputStream;

10import java.io.OutputStream;

11import java.util.Enumeration;

13import org.apache.tools.zip.ZipEntry;

14import org.apache.tools.zip.ZipFile;

15import org.apache.tools.zip.ZipOutputStream;

17/** *//**
* 压缩/解压缩zip包处理类
*
* @author yayagepei
* @date 2008-8-25
*/

23public class ZipUtil {

/** *//**
* 压缩
*
* @param zipFileName
* 压缩产生的zip包文件名--带路径,如果为null或空则默认按文件名生产压缩文件名
* @param relativePath
* 相对路径,默认为空
* @param directory
* 文件或目录的绝对路径
* @throws FileNotFoundException
* @throws IOException
* @author yayagepei
* @date 2008-8-26
*/
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();
}
}
}

/** *//**
* 压缩
*
* @param zos
* 压缩输出流
* @param relativePath
* 相对路径
* @param absolutPath
* 文件或文件夹绝对路径
* @throws IOException
* @author yayagepei
* @date 2008-8-26
*/
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);
}
}

/** *//**
* 压缩文件
*
* @param zos
* 压缩输出流
* @param file
* 文件对象
* @param relativePath
* 相对路径
* @throws IOException
* @author yayagepei
* @date 2008-8-26
*/
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();
}
}
}

/** *//**
* 创建目录
*
* @param zos
* zip输出流
* @param relativePath
* 相对路径
* @throws IOException
* @author yayagepei
* @date 2008-8-26
*/
private static void createZipNode(ZipOutputStream zos, String relativePath)
throws IOException {
ZipEntry zipEntry = new ZipEntry(relativePath);
zos.putNextEntry(zipEntry);
zos.closeEntry();
}

/** *//**
* 解压缩zip包
*
* @param zipFilePath
* zip文件路径
* @param targetPath
* 解压缩到的位置,如果为null或空字符串则默认解压缩到跟zip包同目录跟zip包同名的文件夹下
* @throws IOException
* @author yayagepei
* @date 2008-9-28
*/
public static void unzip(String zipFilePath, String targetPath)
throws IOException {
OutputStream os = null;
InputStream is = null;
ZipFile zipFile = null;
try {
zipFile = new ZipFile(zipFilePath);
String directoryPath = "";
if (null == targetPath || "".equals(targetPath)) {
directoryPath = zipFilePath.substring(0, zipFilePath
.lastIndexOf("."));
} else {
directoryPath = targetPath;
}
Enumeration entryEnum = zipFile.getEntries();
if (null != entryEnum) {
ZipEntry zipEntry = null;
while (entryEnum.hasMoreElements()) {
zipEntry = (ZipEntry) entryEnum.nextElement();
if (zipEntry.isDirectory()) {
directoryPath = directoryPath + File.separator
+ zipEntry.getName();
System.out.println(directoryPath);
continue;
}
if (zipEntry.getSize() > 0) {
// 文件
File targetFile = FileUtil.buildFile(directoryPath
+ File.separator + zipEntry.getName(), false);
os = new BufferedOutputStream(new FileOutputStream(
targetFile));
is = zipFile.getInputStream(zipEntry);
byte[] buffer = new byte[4096];
int readLen = 0;
while ((readLen = is.read(buffer, 0, 4096)) >= 0) {
os.write(buffer, 0, readLen);
}

os.flush();
os.close();
} else {
// 空目录
FileUtil.buildFile(directoryPath + File.separator
+ zipEntry.getName(), true);
}
}
}
} catch (IOException ex) {
throw ex;
} finally {
if(null != zipFile){
zipFile = null;
}
if (null != is) {
is.close();
}
if (null != os) {
os.close();
}
}
}

230}

补充一下里面用到的一个自己写的FileUtil的一个方法
/**

* 生产文件 如果文件所在路径不存在则生成路径

*

* @param fileName

* 文件名 带路径

* @param isDirectory 是否为路径

* @return

* @author yayagepei

* @date 2008-8-27

*/

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;

}

 

///////http://www.cnblogs.com/yayagepei/articles/1309789.html

java压缩/解压缩zip格式文件

标签:build   next   redo   post   ring   创建   nts   trim   buffer   

原文地址:http://www.cnblogs.com/wishlix/p/8022163.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!