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

来源:互联网 发布:设计公司logo软件 编辑:程序博客网 时间:2024/06/16 11:04

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

/**
* 压缩文件
*
*@paramfilePath待压缩的文件路径
*@return压缩后的文件
*/
public static File zip(String filePath) {
File target =null;
File source =newFile(filePath);
if(source.exists()) {
// 压缩文件名=源文件名.zip
String zipName = source.getName() + ".zip";
target =newFile(source.getParent(), zipName);
if(target.exists()) {
target.delete();// 删除旧的文件
}
FileOutputStream fos =null;
ZipOutputStream zos =null;
try{
fos =newFileOutputStream(target);
zos =newZipOutputStream(newBufferedOutputStream(fos));
// 添加对应的文件Entry
addEntry("/", source, zos);
}catch(IOException e) {
throw new RuntimeException(e);
}finally{
ZipUtil.close(zos, fos);
}
}
returntarget;
}
/**
* 解压文件
*
*@paramfilePath压缩文件路径
*/
public static void unzip(String filePath) {
File source =newFile(filePath);
if(source.exists()) {
ZipInputStream zis =null;
BufferedOutputStream bos =null;
try{
zis =newZipInputStream(newFileInputStream(source));
ZipEntry entry =null;
while((entry = zis.getNextEntry()) !=null) {
if(!entry.isDirectory()){
File target =newFile(source.getParent(), entry.getName());
if(!target.getParentFile().exists()) {
// 创建文件父目录
target.getParentFile().mkdirs();
}
// 写入文件
bos = newBufferedOutputStream(newFileOutputStream(target));
intread =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
*
*@parambase基路径
*
*@paramsource源文件
*@paramzosZip文件输出流
*@throwsIOException
*/
private static void addEntry(String base, File source, ZipOutputStream zos)throwsIOException {
// 按目录分级,形如:/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 =newFileInputStream(source);
bis =newBufferedInputStream(fis, buffer.length);
intread =0;
zos.putNextEntry(newZipEntry(entry));
while((read = bis.read(buffer,0, buffer.length)) != -1) {
zos.write(buffer,0, read);
}
zos.closeEntry();
}finally{
ZipUtil.close(bis, fis);
}
}
}


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

e.printStackTrace();
}
}
}
}
}
}