apache tools压缩成zip格式的文件

来源:互联网 发布:linux开机启动流程 编辑:程序博客网 时间:2024/06/05 18:49
     /**                                                                                                                                  
     * 创建ZIP文件                                                                                                                            
     * @param sourcePath 文件或文件夹路径                                                                                                         
     * @param zipPath 生成的zip文件存在路径(包括文件名)                                                                                                 
     */                                                                                                                                   
    public static void zip(String sourcePath,String targetPath){                                                                          
        FileOutputStream fos = null;                                                                                                      
        ZipOutputStream zos = null;                                                                                                       
        try {                                                                                                                             
            //创建压缩文件输出流                                                                                                                   
            fos = new FileOutputStream(targetPath);                                                                                       
            //创建压缩文件压缩流                                                                                                                   
            zos = new ZipOutputStream(fos);                                                                                               
            //压缩处理                                                                                                                        
            writeZip(new File(sourcePath),"",zos);                                                                                        
        } catch (FileNotFoundException e) {                                                                                               
            e.printStackTrace();                                                                                                          
        }finally{                                                                                                                         
            try {                                                                                                                         
                if(zos != null){                                                                                                          
                //flush的作用是强制将缓冲区里的东西立刻执行(立刻写到输出流中去),然后清空,不管里面有多少东西                                                                       
                    zos.flush();                                                                                                          
                    zos.close();                                                                                                          
                }                                                                                                                         
                if(fos != null){                                                                                                          
                    fos.flush();                                                                                                          
                    fos.close();                                                                                                          
                }                                                                                                                         
            } catch (IOException e) {                                                                                                     
                e.printStackTrace();                                                                                                      
            }                                                                                                                             
        }                                                                                                                                 
    }                                                                                                                                     
                                                                                                                                          
    //压缩处理                                                                                                                                
    public static void writeZip(File file,String parentPath,ZipOutputStream zos){                                                         
        if(file.exists()){                                                                                                                
            if(file.isDirectory()){                                                                                                       
                /*file.separator:与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。此字符串只包含一个字符,即 separatorChar。                                               
                 *separatorChar:与系统有关的默认名称分隔符。此字段被初始化为包含系统属性 file.separator 值的第一个字符。                                                      
                 *在 UNIX 系统上,此字段的值为 ‘/’;在 Microsoft Windows 系统上,它为 ‘\’。 */                                                                
                parentPath += file.getName()+File.separator;                                                                              
                File[] files = file.listFiles();                                                                                          
                for(File f : files){                                                                                                      
                    writeZip(f,parentPath,zos);                                                                                           
                }                                                                                                                         
            }else{                                                                                                                        
                FileInputStream fis = null;                                                                                               
                try {                                                                                                                     
                    fis = new FileInputStream(file);                                                                                      
                    //创建一个zipEntry对象                                                                                                      
                    ZipEntry ze = new ZipEntry(parentPath+file.getName());                                                                
                    //将ZipEntry加到zos中,再写入实际的文件内容                                                                                          
                    zos.putNextEntry(ze);                                                                                                 
                    //添加编码,如果不添加,当文件以中文命名的情况下,会出现乱码                                                                                       
                    //ZipOutputStream的包一定是apache的ant.jar包。JDK也提供了打压缩包,但是不能设置编码                                                            
                    zos.setEncoding("GBK");                                                                                               
                    //设置缓冲区的大小                                                                                                            
                    byte[] content = new byte[1024];                                                                                      
                    int len; //表示成功读取的字节数的个数                                                                                              
                    //fis.read(content)将filepath的文件放入contetn作为内存缓冲区并获得可读的长度len                                                            
                    //FileInputStream可以使用read(byte[] b )每次读取多个(b.length)字节数据(每次最多读取多少个)到byte数组当中                                          
                    while((len=fis.read(content))!=-1){                                                                                   
                        /*然后write(content,0,len)写到OutputStream中,                                                                          
                         * 每次都是从content内存处的0偏移开始写,每次写len字节*/                                                                              
                        zos.write(content,0,len);                                                                                         
                    }                                                                                                                     
                    zos.flush();                                                                                                          
                    zos.closeEntry();                                                                                                     
                } catch (Exception e) {                                                                                                   
                    e.printStackTrace();                                                                                                  
                }finally{                                                                                                                 
                    try {                                                                                                                 
                        if(fis != null){                                                                                                  
                        fis.close();                                                                                                      
                        }                                                                                                                 
                    } catch (IOException e) {                                                                                             
                        e.printStackTrace();                                                                                              
                    }                                                                                                                     
                }                                                                                                                         
            }                                                                                                                             
        }                                                                                                                                 
    }                                                                                                                                     
                                                                                                                                         
0 0