`
aerchi
  • 浏览: 425966 次
  • 性别: Icon_minigender_1
  • 来自: 昆明
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多
解决中文压缩与解压问题
使用的是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(); 
    } 
} 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics