java Zip文件的压缩与解压, 兼容Windows和Linux


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
/**
* zip文件解压与压缩
* @author zhanglei
* @date 创建时间:2016年11月24日 下午5:00:07
*/
public class ZipUtil {

/**
* 压缩文件
*
* @param filePath 待压缩的文件路径
* @return 压缩后的文件
*/
public static File zip(String filePath) {
File target = null ;
File source = new File(filePath);
if (source.exists()) {
// 压缩文件名=源文件名.zip
String zipName = source.getName() + ".zip" ;
target = new File(source.getParent(), zipName);
if (target.exists()) {
target.delete(); // 删除旧的文件
}
FileOutputStream fos = null ;
ZipOutputStream zos = null ;
try {
fos = new FileOutputStream(target);
zos = new ZipOutputStream( new BufferedOutputStream(fos));
// 添加对应的文件Entry
addEntry ( "/" , source, zos);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
ZipUtil. close (zos, fos);
}
}
return target;
}
/**
* 解压文件
*
* @param filePath 压缩文件路径
*/
public static void unzip(String filePath) {
File source = new File(filePath);
if (source.exists()) {
ZipInputStream zis = null ;
BufferedOutputStream bos = null ;
try {
zis = new ZipInputStream( new FileInputStream(source));
ZipEntry entry = null ;
while ((entry = zis.getNextEntry()) != null ) {
if (!entry.isDirectory()){
File target = new File(source.getParent(), entry.getName());
if (!target.getParentFile().exists()) {
// 创建文件父目录
target.getParentFile().mkdirs();
}
// 写入文件
bos = new BufferedOutputStream( new FileOutputStream(target));
int read = 0 ;
byte [] buffer = new byte [ 1024 * 10 ];
while ((read = zis.read(buffer, 0 , buffer. length )) != - 1 ) {
bos.write(buffer, 0 , read);
}
bos.flush();
ZipUtil. close (bos);
}
}
zis.closeEntry();
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
ZipUtil. close (zis, bos);

}
}
}
/**
* 扫描添加文件Entry
*
* @param base 基路径
*
* @param source 源文件
* @param zos Zip文件输出流
* @throws IOException
*/
private static void addEntry(String base, File source, ZipOutputStream zos) throws IOException {
// 按目录分级,形如:/aaa/bbb.txt
// String entry = base + source.getName();
String entry = source.getName();
if (source.isDirectory()) {
for (File file : source.listFiles()) {
// 递归列出目录下的所有文件,添加文件Entry
addEntry (entry + "/" , file, zos);
}
} else {
FileInputStream fis = null ;
BufferedInputStream bis = null ;
try {
byte [] buffer = new byte [ 1024 * 10 ];
fis = new FileInputStream(source);
bis = new BufferedInputStream(fis, buffer. length );
int read = 0 ;
zos.putNextEntry( new ZipEntry(entry));
while ((read = bis.read(buffer, 0 , buffer. length )) != - 1 ) {
zos.write(buffer, 0 , read);
}
zos.closeEntry();
} finally {
ZipUtil. close (bis, fis);
}
}
}


/**
* 关闭流对象
*
* @param closeables 可关闭的流对象列表
* @throws IOException
*/
private static void close(Closeable... closeables) {
if (closeables != null ) {
for (Closeable closeable : closeables) {
if (closeable != null ) {
try {
closeable.close();
} catch (IOException e) {

e.printStackTrace();
}
}
}
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值