文档章节

Java实现Zip压缩与解压(解决中文乱码问题)

李长春
 李长春
发布于 2011/07/19 13:27
字数 613
阅读 3167
收藏 5
解决中文压缩与解压问题 
使用的是org.apache.tools.zip包下面的相关类 
下面是自己写的类,可以设置和获取Zip文件的注释信息 

Java代码  
import java.io.File;   
import java.io.FileInputStream;   
import java.io.FileOutputStream;   
import java.io.InputStream;   
import java.util.ArrayList;   
import java.util.Enumeration;   
import java.util.List;   
   
import org.apache.tools.zip.ZipEntry;   
import org.apache.tools.zip.ZipFile;   
import org.apache.tools.zip.ZipOutputStream;   
   
   
public class ZipUtil {   
       
    private String comment = "";   
       
    public void setComment(String comment) {   
        this.comment = comment;   
    }   
   
       
    public void zip(String src, String dest, List filter) throws Exception {   
        ZipOutputStream out = new ZipOutputStream(new FileOutputStream(dest));   
        File srcFile = new File(src);   
        zip(out,srcFile,"",filter);   
        out.close();   
    }   
       
       
    public void zip(ZipOutputStream out, File srcFile, String base, List filter) throws Exception {   
        if(srcFile.exists()==false) {   
            throw new Exception("压缩目录不存在!");   
        }   
           
        if(srcFile.isDirectory()) {   
            File[] files = srcFile.listFiles();   
            base = base.length() == 0 ? "" : base + "/";   
            if (isExist(base, filter)) {   
                out.putNextEntry(new ZipEntry(base));   
            }   
            for(int i=0; i<files.length; i++) {   
                zip(out,files[i],base + files[i].getName(),filter);   
            }   
        } else {   
            if (isExist(base, filter)) {   
                base = base.length() == 0 ? srcFile.getName() : base ;   
                ZipEntry zipEntry = new ZipEntry(base);   
                zipEntry.setComment(comment);   
                out.putNextEntry(zipEntry);   
                FileInputStream in = new FileInputStream(srcFile);   
                int length = 0;   
                byte[] b = new byte[1024];   
                while((length=in.read(b,0,1024))!=-1) {   
                    out.write(b,0,length);   
                }   
                in.close();   
            }   
        }   
    }   
       
       
    public boolean isExist(String base, List list) {   
        if (list != null && !list.isEmpty()) {   
            for (int i = 0; i < list.size(); i++) {   
                if (base.indexOf((String) list.get(i)) >= 0) {   
                    return true;   
                }   
            }   
        }   
        return false;   
    }   
       
       
    public void unZip(String srcFile,String dest,boolean deleteFile)  throws Exception {   
        File file = new File(srcFile);   
        if(!file.exists()) {   
            throw new Exception("解压文件不存在!");   
        }   
        ZipFile zipFile = new ZipFile(file);   
        Enumeration e = zipFile.getEntries();   
        while(e.hasMoreElements()) {   
            ZipEntry zipEntry = (ZipEntry)e.nextElement();   
            if(zipEntry.isDirectory()) {   
                String name = zipEntry.getName();   
                name = name.substring(0,name.length()-1);   
                File f = new File(dest + name);   
                f.mkdirs();   
            } else {   
                File f = new File(dest + zipEntry.getName());   
                f.getParentFile().mkdirs();   
                f.createNewFile();   
                InputStream is = zipFile.getInputStream(zipEntry);   
                FileOutputStream fos = new FileOutputStream(f);   
                int length = 0;   
                byte[] b = new byte[1024];   
                while((length=is.read(b, 0, 1024))!=-1) {   
                    fos.write(b, 0, length);   
                }   
                is.close();   
                fos.close();   
            }   
        }   
           
        if (zipFile != null) {   
            zipFile.close();   
        }   
           
        if(deleteFile) {   
            file.deleteOnExit();   
        }   
    }   
       
       
    public static String getZipComment(String srcFile) {   
        String comment = "";   
        try {   
            ZipFile zipFile = new ZipFile(srcFile);   
            Enumeration e = zipFile.getEntries();   
   
            while (e.hasMoreElements()) {   
                ZipEntry ze = (ZipEntry) e.nextElement();   
   
                comment = ze.getComment();   
                if (comment != null && !comment.equals("")   
                        && !comment.equals("null")) {   
                    break;   
                }   
            }   
   
            zipFile.close();   
        } catch (Exception e) {   
            System.out.println("获取zip文件注释信息失败:" + e.getMessage());   
        }   
   
        return comment;   
    }   
   
    public static void main(String[] args) throws Exception {   
        long begin = System.currentTimeMillis();   
        ZipUtil zu = new ZipUtil();   
        List<String> filter = new ArrayList<String>();   
        filter.add("3RDPARTY");   
        filter.add("BANNER.GIF");   
        zu.setComment("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");   
        zu.zip("C:/VALUEADD", "c:/hh.zip",filter);   
        System.out.println(ZipUtil.getZipComment("c:/hh.zip"));   
        //new ZipUtil().unZip("c:/tt.zip", "c:/mmmmmmmmmmmmmmmmmmm/", true);   
        //File f = new File("c:/hh.zip");   
        //f.deleteOnExit();   
        long end = System.currentTimeMillis();   
        System.out.println(end-begin);   
    }   
}   
  




如果不需要上面的filter,可以添加fileter为空list或者用下面的程序: 


不带filter的zip压缩: 
// 
// * @author WeiMiao 
// * @param out: ZipOutputStream 
// * @param srcFile: 要压缩的目录 
// * @param base: 根路径 
// * @throws Exception 
// 
public static void zip(ZipOutputStream out, File srcFile, String base) throws Exception { 
    if (!srcFile.exists()) { 
        throw new Exception("压缩目录不存在!"); 
    } 
    if (srcFile.isDirectory()) { 
        File[] files = srcFile.listFiles(); 
        base = base.length() == 0 ? "" : base + "/"; 
        if (base.length() > 0) { 
            out.putNextEntry(new ZipEntry(base)); 
        } 
        for (int i = 0; i < files.length; i++) { 
            zip(out, files[i], base + files[i].getName()); 
        } 
    } else { 
        base = base.length() == 0 ? srcFile.getName() : base; 
        out.putNextEntry(new ZipEntry(base)); 
        FileInputStream fis = new FileInputStream(srcFile); 
        int length = 0; 
        byte[] b = new byte[BUFFER]; 
        while ((length = fis.read(b, 0, BUFFER)) != -1) { 
            out.write(b, 0, length); 
        } 
        fis.close(); 
    } 
}

© 著作权归作者所有

李长春
粉丝 81
博文 249
码字总数 117406
作品 0
海淀
私信 提问
使用ubuntu 10.04中的中文乱码问题解决

1、ibus输入法 Ubuntu 系统安装后已经自带了ibus输入法,在英语环境下默认不启动。 配置ibus自动启动可以在ubuntu系统菜单上选择System --- Preferences --- Startup Applications,在该窗口...

durban
2012/08/25
199
0
zip压缩问题

java压缩了zip文件,linux下用unzip解压,中文名称乱码,网上查的都不对,1是用 ant下面的试过也是乱码2设置gbk还是乱码,3用过zip4j 解压还是乱码,设置编码gbk utf-8 也试过了,还是乱码,...

obhen
2017/10/25
381
5
Tomcat中文乱码问题的原理和解决方法

Tomcat中文乱码问题的原理和解决方法   自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。   一、Java中文问题的由...

孙斐
2013/02/26
250
0
Centos下安装类百度文库环境

使用php实现百度文库功能,网上搜索到的方案,实现doc转pdf,pdf转swf,然后显示出来。 这里简单的记录下,【doc转pdf,pdf转swf】两个功能的搭建流程。 doc转pdf 使用到下列程序(文件): Ap...

DragonFK
2013/02/20
1K
1
解决Eclipse中.properties文件中文乱码问题

在.properties文件写注释时,发现中文乱码了,由于之前在idea中有见设置.properties文件的编码类型,便找了找乱码原因 在中文操作系统中,Eclipse中的Java类型文件的编码的默认设置是GBK,但...

yzbty23
03/18
23
0

没有更多内容

加载失败,请刷新页面

加载更多

html2canvas 生成的图片变模糊解决方案

需求: 背景图片和二维码还有用户微信头像生成一张图片,可供用户下载。打开页面的时候就是一张图可以保存,html2canvas插件即可实现效果,效果是实现了,但是很郁闷,图片模糊了。。。。 为...

前端老手
28分钟前
6
0
语音翻译器在线翻译语音

对于英语不好的朋友来说,如果出国旅游,多多少少都会使用到翻译软件。通过在线翻译的方式,方便彼此的沟通交流。那么,有朋友就在问哪个英语翻译软件最准确?下面就来和大家一起分享下这个简...

401恶户
28分钟前
6
0
国内25家滤波器公司排名

国内做滤波器的企业都有哪些?哪些企业做滤波器是比较知名的?国内滤波器企业排名如何?以下是解优人才网小编给大家的分享,国内前25家做滤波器的企业详细信息。 1、武汉凡谷电子技术股份有限...

猎头悬赏平台
33分钟前
7
0
即时配送,不再只是巨头的战场

9月4日,第十届中国电子商务物流大会暨2019中国同城即时物流行业峰会于杭州召开。会上出现了蜂鸟即配、达达-京东到家、美团配送、点我达、闪送等一众即时配送行业中的知名企业的身影。 在艾媒...

喵二狸
34分钟前
6
0
Moto G 2014 LTE Root

[TOC] 下载moto专用mfastboot mfastboot-v2.zip 下载对应设备的twrp 我的是这个版本 Moto G 2014 LTE thea 刷入twrp # 1. 开启USE调试# 2. 允许OEM解锁# 3. 查看设备adb devices# 4. 进f...

yeahlife
37分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部