zip文件结构
     
     上面中的每一行都是一个条目,zip文件就是由一个或者多个条目组成。
     条目在Java中对应ZipEntry类
     
 
创建zip压缩文件
     知道了zip文件结构之后,大概就知道怎么去创建一个zip压缩文件了。
     之前,先了解下创建普通的文件都是经过以下几个步骤:
     1、创建文件输出流FileOutputStream fout = new FileOutputStream(new File("XXX"));
     2、往文件输出流中写入文件内容,fout.write(XXX);
     3、关闭输出流fout.close();
     这样,一个普通的创建就是生成了
 
     既然zip压缩文件也是文件,那么它的创建也基本都差不多,只是,zip文件结构跟普通文件有点差别,因为它里面是由条目(ZipEntry)组成的。
     所以创建zip压缩文件的步骤如下:
     1、创建zip压缩文件输出流
           ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(new File("XXX")));
 
     2、创建zip文件条目
           ZipEntry entry = new ZipEntry(name)
           备注:name指定条目的名称,例如上图显示的client.cer,这里name可以带路径,例如:a/b/c/test.txt,这样就是创建a/b/c这个目录。
 
     3、将条目添加到zip文件输出流
          zos.putNextEntry(entry);
     
     4、创建被文件的输入流,读取文件内容,并写入到zip压缩文件输出流。这个时候,写入的内容都属于当前这个条目的。
         FileInputStream in = new FileInputStream(new File("XXX"));
     byte[]buffer = new byte[1024];
     int len = 0;
     while((len = in.read(buffer))!=-1){
          zos.write(buffer ,0 ,len);

}

     in.close();
 

     5、关闭zip文件输出流
         zos.close()
 
 

zip乱码问题解决

       使用Apache中的org.apache.tools.zip.ZipOutputStream类来替换Java自带的ZipOutputStream类
       FileOutputStream fout = new FileOutputStream("f:\\abc.zip");
    ZipOutputStream out = new ZipOutputStream(fout);
    out.setEncoding("utf-8"); //这条语句时必须的,否则,生成中文条目时,无法打开zip文件或者出现乱码
    ZipEntry entry = new ZipEntry("测试文件.txt");

out.putNextEntry(entry);

 
误解区:
    以前都是以为一个文件或者目录就对应zip文件中的一个条目,其实并非一定是这样的。解析如下:
    zip文件是以条目来组织,操作zip文件都是基于条目来进行的,因此,每次往条目新增内容时,
    得首先创建zip文件条目,并将添加到zip文件输出,之后,zip输出流,才认为之后写入到输出流中的
    内容都是属于这个条目,直到zip输出流中新增新的条目。不过一般来正常来说,都是一个文件或者目录就对应zip文件中的一个条目。
    
    正常情况下,一个文件或者目录对应一个条目,如下图:
    
       
       但是也可以将a.txt、b.txt的内容都只写入的一个条目c.txt
       
 
       生成的zip文件结果图:
       
       这里可以发现,只要没有重新往zip文件输出流中添加新的条目,那么,所有的内容都是写入当前条目中。
 
 
自己封装的一个zip压缩工具类
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
 
public class FilleUtils {
    
    
    /**
     * zip压缩文件,默认生成的压缩文件目录与当前需要压缩的文件或者目录同级
     * @param filePath  需要压缩的文件或者目录
     * @return 返回zip压缩文件路径
     */
    public static String zip(String filePath) throws Exception{
         System.out.println("压缩中..."); 
         String zipFilePath = null;
         File srcFile = new File(filePath);
         
         //获得zip文件路径
         if(srcFile.isDirectory()){
             zipFilePath = srcFile.getParent() + srcFile.getName() + ".zip";
         }
         else{
             String zipFileName = "";
             if(srcFile.getName().indexOf(".")>-1)
                 zipFileName = srcFile.getName().substring(0 ,srcFile.getName().lastIndexOf(".")) + ".zip";
             else
                 zipFileName = srcFile.getName() + ".zip";
             zipFilePath = srcFile.getParent() + zipFileName;
         }
         
         //开始进行压缩
         ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFilePath));   
         BufferedOutputStream bo = new BufferedOutputStream(out);  
         zip(out, srcFile, srcFile.getName(), bo);  
         bo.close();  
         out.close(); 
         System.out.println("压缩完成");  
         
         return zipFilePath;
    }
    
    
    /**
     * zip压缩文件
     * @param filePath
     * @param zipFilePath
     */
    public static void zip(String filePath ,String zipFilePath) throws Exception{
         System.out.println("压缩中..."); 
         File srcFile = new File(filePath);
         
         //检查压缩文件路径是否存在,不存在则创建
         File zipFile = new File(zipFilePath);
         if(!zipFile.exists()){
             zipFile.getParentFile().mkdirs();
         }
         
         //开始压缩
         ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFilePath));   
         BufferedOutputStream bo = new BufferedOutputStream(out);  
         zip(out, srcFile, srcFile.getName(), bo);  
         bo.close();  
         out.close();  
         System.out.println("压缩完成");  
    }
    
    
    
    /**
     * 压缩指定的多个文件或者目录
     * @param filePathList
     * @param zipFilePath
     * @throws Exception
     */
    public static void zip(ArrayList<String> filePathList , String zipFilePath) throws Exception{
         System.out.println("压缩中...");
         //检查压缩文件路径是否存在,不存在则创建
         File zipFile = new File(zipFilePath);
         if(!zipFile.exists()){
             zipFile.getParentFile().mkdirs();
         }
        
         //开始压缩
         ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFilePath));  
         BufferedOutputStream bo = new BufferedOutputStream(out); 
         if(filePathList==null || filePathList.size()==0){
             throw new RuntimeException("没有指定需要压缩的文件");
         }
         for(String filePath :filePathList){
             File srcFile = new File(filePath);
             zip(out, srcFile, srcFile.getName(), bo); 
         }
         bo.close();  
         out.close(); 
         System.out.println("压缩完成"); 
    }
    
    
    
    private static void zip(ZipOutputStream out , File srcFile ,String base ,BufferedOutputStream bo) throws Exception{
        
        //如果需要压缩的文件是目录,则进行递归压缩处理
        if(srcFile.isDirectory()){
            File[] fileList = srcFile.listFiles();  
            
            //如果是空目录,也需要将该目录压缩进去,注意,此时zipentry的name必须以“/"结束
            if (fileList.length == 0) {  
                out.putNextEntry(new ZipEntry(base + "/")); // 创建zip压缩进入点base  
                out.closeEntry();
            }  
            for (int i = 0; i < fileList.length; i++) {  
                zip(out, fileList[i], base + "/" + fileList[i].getName(), bo); // 递归遍历子文件夹  
            } 
        }
        else{
            out.putNextEntry(new ZipEntry(base)); // 创建zip压缩进入点base  
            FileInputStream in = new FileInputStream(srcFile);  
            byte[]buffer = new byte[1024];
            int len = 0;
            while((len = in.read(buffer))!=-1){
                out.write(buffer ,0 ,len);
            }  
            in.close(); // 输入流关闭 
        }

}

 
 
 
http://www.cnblogs.com/itmanxgl/p/84db9a95b5d84643580678994f6488b4.html

zip文件压缩(转)的更多相关文章

  1. Zip文件压缩(加密||非加密||压缩指定目录||压缩目录下的单个文件||根据路径压缩||根据流压缩)

    1.写入Excel,并加密压缩.不保存文件 String dcxh = String.format("%03d", keyValue); String folderFileName ...

  2. C#执行zip文件压缩的几种方法及我遇到的坑总结

    工作项目中需要用到zip压缩解压缩文件,一开始看上了Ionic.Zip.dll这个类库,操作方便,写法简单 对应有个ziphelper类 using Ionic.Zip; public static ...

  3. 使用commons-compress操作zip文件(压缩和解压缩)

    http://www.cnblogs.com/luxh/archive/2012/06/28/2568758.html Apache Commons Compress是一个压缩.解压缩文件的类库. 可 ...

  4. python zip文件压缩和解压

    压缩 import shutil zipOutputName = "1234" # 输出1234.zip fileType = "zip" # 文件类型zip ...

  5. ZIP文件压缩和解压

    最近要做一个文件交互,上传和下载, 都是zip压缩文件,所以研究了下,写了如下的示例 注意引用  ICSharpCode.SharpZipLib.dll 文件 该dll文件可以到官方网站去下载, 我这 ...

  6. zip文件压缩

    zip文件结构            上面中的每一行都是一个条目,zip文件就是由一个或者多个条目组成.      条目在Java中对应ZipEntry类       创建zip压缩文件      知 ...

  7. 利用Java进行zip文件压缩与解压缩

    摘自: https://www.cnblogs.com/alphajuns/p/12442315.html 工具类: package com.alphajuns.util; import java.i ...

  8. 跨平台的zip文件压缩处理,支持压缩解压文件夹

    根据minizip改写的模块,需要zlib支持 输出的接口: #define RG_ZIP_FILE_REPLACE 0 #define RG_ZIP_FILE_APPEND 1 //压缩文件夹目录, ...

  9. Android zip文件压缩解压缩

    DirTraversal.java <P style="TEXT-ALIGN: left; PADDING-BOTTOM: 0px; WIDOWS: 2; TEXT-TRANSFORM ...

随机推荐

  1. 根据输出设置select的被选中值

    $("#startupStatus").find("option").map(function(i) { if ($('#st-status').val() = ...

  2. WndProc Msg 消息列表

    WM_NULL = 0x0000; WM_CREATE = 0x0001;应用程序创建一个窗口 WM_DESTROY = 0x0002;一个窗口被销毁 WM_MOVE = 0x0003;移动一个窗口 ...

  3. Android EditeText常用功能盘点

    这篇集合了项目里经常用到的EditText的需求,以前单个问题总结过,现在放在一起以备后患啊,主要包含以下方面: 1. 判断输入字符长度 2. 键盘的显示与隐藏 3. 对输入内容的限制,列举几种常见的 ...

  4. android上传位置信息导致的流量大爆炸问题调查

    原由:项目中有人写了个位置上传的服务,其实一直没问题,后来不知道什么时候出现了很多抱怨,是开着app流量一下子跑掉了几个G,差点就要卖房子还移动话费了,很多同事哭笑不得的找上门来,后来PM解决了,我一 ...

  5. SQL Server JDBC驱动中sqljdbc和sqljdbc4区别

    为了支持向后兼容以及可能的升级方案,JDBC Driver 2.0 在每个安装包中都包括 2 个 JAR 类库:sqljdbc.jar 和 sqljdbc4.jar. qljdbc.jar 类库提供对 ...

  6. 转场动画2-Pop动画

    上一篇试讲push动画,这篇分解pop动画 里面关于矩阵有不懂得,参考CATransform3D 特效详解 上图(虚拟机下,图是渣渣 ) 代码直接上 // // PopTransition.h // ...

  7. Linux学习之Makefile文件的编写

    转自:http://goodcandle.cnblogs.com/archive/2006/03/30/278702.html 目的:       基本掌握了 make 的用法,能在Linux系统上编 ...

  8. CPUから広がり

    处理技术: 超标量是通过内置多条流水线来同时执行多个处理器,其实质是以空间换取时间.而超流水线是通过细化流水.提高主频,使得在一个机器周期内完成一个甚至多个操作,其实质是以时间换取空间. スター: 真 ...

  9. 一个给力的html5 画多边形的例子

    只需改变参数就能画出你想要的多边形,代码简单!不得不惊叹canvas的强大! 代码奉上 <!doctype html> <html> <head> <meta ...

  10. td之overflow:hidden 多余文本隐藏效果

    td之overflow:hidden 多余文本隐藏效果 方法1: table-layout: fixed; width: 200px; 语法: table-layout : auto | fixed ...