`

java zip操作

    博客分类:
  • j2ee
阅读更多
1.基本解压,压缩操作
package com.jason.zip;

import com.jason.j2ee.encode.ChangeCharset;
import org.apache.tools.zip.ZipOutputStream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
 * Created by IntelliJ IDEA.
 * User: jason
 * Date: 2010-6-23
 * Time: 15:27:21
 */
public class CompressToZip {
      public void zip(String inputFileName) throws Exception {   
         String zipFileName = "d:\\批量打包.zip";// 打包后文件名字   
         System.out.println(zipFileName);   
         zip(zipFileName, new File(inputFileName));   
   
     }   
   
     private void zip(String zipFileName, File inputFile)throws Exception {   
         ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
         out.setEncoding(ChangeCharset.UTF_8);
         zip(out, inputFile, "");   
         System.out.println("zip done");   
         out.close();   
     }   
        
   
     private void zip(ZipOutputStream out, File f, String base) throws Exception {
         if (f.isDirectory()) {   
             File[] fl = f.listFiles();
             System.out.println("新增目录元素   " +base+ "/");   
             out.putNextEntry(new org.apache.tools.zip.ZipEntry(base + "/"));   
             base = base.length() == 0 ? "" : base + "/";   
             for (int i = 0; i < fl.length; i++) {   
                 zip(out, fl[i], base + fl[i].getName());   
             }   
         } else {
             String fileName = ChangeCharset.changeCharset(base, ChangeCharset.UTF_8);
             System.out.println("新增普通文件元素   " +fileName);
             out.putNextEntry(new org.apache.tools.zip.ZipEntry(fileName));
             FileInputStream in = new FileInputStream(f);
             int b;   
             while ((b = in.read()) != -1) {   
                 out.write(b);   
             }   
             in.close();
         }   
     }   
   
     public static void main(String[] args) {   
         CompressToZip test = new CompressToZip();   
         try {   
             test.zip("d:\\tmp");   
         } catch (Exception e) {   
             e.printStackTrace();   
         }   
     }   
}


2.基于Java Zip技术压缩目录或文件
package com.jason.zip;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
* 基于Java Zip技术压缩目录或文件.
* 该压缩技术支持多级目录的压缩,使用递归算法.
* 问题是不支持中文,如果想要支持中文,请使用Ant的Zip技术.
*
* Created by IntelliJ IDEA.
 * User: jason
 * Date: 2010-6-23
 * Time: 15:22:46
*/
public class ZipMultiDirectoryCompress {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //初始化支持多级目录压缩的ZipMultiDirectoryCompress
        ZipMultiDirectoryCompress zipCompress = new ZipMultiDirectoryCompress();
        //压缩目录,可以指向一个文件
        String directory = "C:/computer";
        //生成的压缩文件
        String destFile = "c:/computer.zip";
        //默认的相对地址,为根路径
        String defaultParentPath = "";
        ZipOutputStream zos = null;
        try {
            //创建一个Zip输出流
            zos = new ZipOutputStream(new FileOutputStream(destFile));
            //启动压缩进程
            zipCompress.startCompress(zos,defaultParentPath,directory);
        } catch (FileNotFoundException e){
            e.printStackTrace();
        } finally{
            try {
                if(zos != null)zos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * 开始压缩.
     *
     * @param zos ZipOutputStream
     * @param oppositePath 相对路径,开始时相对路径为空
     * @param directory 压缩目录,也可能是文件
     */
    public void startCompress(ZipOutputStream zos, String oppositePath, String directory){
        File file = new File(directory);
        if(file.isDirectory()){
            //如果是压缩目录
            File[] files = file.listFiles();
            for(int i=0;i<files.length;i++){
                File aFile = files[i];
                if(aFile.isDirectory()){
                    //如果是目录,修改相对地址
                    String newOppositePath = oppositePath + aFile.getName() + "/";
                    //创建目录
                    compressDirectory(zos, oppositePath, aFile);
                    //进行递归调用
                    startCompress(zos,newOppositePath,aFile.getPath());
                } else {
                    //如果不是目录,则进行压缩
                    compressFile(zos,oppositePath,aFile);
                }
            }
        } else {
            //如果是压缩文件,直接调用压缩方法进行压缩
            compressFile(zos,oppositePath,file);
        }
    }

    /**
     * 压缩文件.
     *
     * @param zos ZipOutputStream
     * @param oppositePath 相对于路路径
     * @param file 压缩的文件
     */
    public void compressFile(ZipOutputStream zos, String oppositePath, File file){
        //创建一个Zip条目,每个Zip条目都是必须相对于根路径
        ZipEntry entry = new ZipEntry(oppositePath + file.getName());
        InputStream is = null;
        try{
            //将条目保存到Zip压缩文件当中
            zos.putNextEntry(entry);
            //从文件输入流当中读取数据,并将数据写到输出流当中.
            is = new FileInputStream(file);
            int length = 0;
            int bufferSize = 1024;
            byte[] buffer = new byte[bufferSize];
            while((length=is.read(buffer,0,bufferSize))>=0){
                zos.write(buffer, 0, length);
            }
            zos.closeEntry();
        }catch(IOException ex){
            ex.printStackTrace();
        } finally {
            try{
                if(is != null)is.close();
            }catch(IOException ex){
                ex.printStackTrace();
            }
        }
    }

    /**
     * 在压缩文件当中创建一个新的压缩目录,支持空目录.
     *
     * @param zos
     * @param oppositePath
     * @param file
     */
    public void compressDirectory(ZipOutputStream zos, String oppositePath, File file){
        //压缩目录,这是关键,创建一个目录的条目时,需要在目录名后面加多一个"/"
        ZipEntry entry = new ZipEntry(oppositePath + file.getName() + "/");
        try {
            zos.putNextEntry(entry);
            zos.closeEntry();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
分享到:
评论

相关推荐

    JAVA 文件常用流操作.zip

    JAVA 文件常用流操作 包括文件的创建,重命名,删除等等。字节流,字符流,缓存流,数据流,打印流,内存流等等

    zip4j--Java操作zip压缩文件接口

    Java操作zip压缩格式的开源项目,功能强大而且使用方便,能完全满足Java操作Zip压缩文件,官方网址为:http://www.lingala.net/zip4j/ 可以下载到jar包、源码和示例,好像没有提供API文档。 不过需要使用代理访问...

    java 操作Zip文件(压缩、解压、加密).zip

    java 操作Zip文件(压缩、解压、加密) zip4j-1.3.2.jar ant-1.10.6.jar

    Java实现Zip压缩文件操作的工具类.zip

    Java实现Zip压缩文件操作的工具类 文章介绍:https://blog.csdn.net/rongbo91/article/details/117747042 (可作为Jar依赖包直接使用) 1、项目使用前,请进入rdc-bom目录下,执行mvn clean install命令  2、可...

    Java Zip算法压缩多个文件的例子.rar

    Java Zip算法压缩多个文件的例子,具体的实现原理是:先打开文件并读取,然后利用ZipEntry实例化待压缩的条目列表,将ZIP条目列表写入输出流,从源文件得到文件输入流,写入缓冲数据等。相关代码:  ...

    67.java中Debug操作流程.zip

    67.java中Debug操作流程.zip67.java中Debug操作流程.zip67.java中Debug操作流程.zip67.java中Debug操作流程.zip67.java中Debug操作流程.zip67.java中Debug操作流程.zip67.java中Debug操作流程.zip67.java中Debug操作...

    29.java字符串+操作.zip

    29.java字符串+操作.zip29.java字符串+操作.zip29.java字符串+操作.zip29.java字符串+操作.zip29.java字符串+操作.zip29.java字符串+操作.zip29.java字符串+操作.zip29.java字符串+操作.zip29.java字符串+操作.zip29...

    Java实现将多目录多层级文件打成ZIP包,以及解压ZIP包

    包含了使用的jar包,以及一个Java类,实现了使用Java对多目录多层级的文件进行打包,以及对ZIP包进行解压缩的操作。

    Java数组操作.zip

    1. 统计并输出大写字母、小写字母、数字和其它字符的数量。 2. 接收命令行输入的一个字符,在字符串s中查找该字符出现的次数以及位置。 3.... 1.... 2. 定义学生类,访问类的实例成员和类成员 、实例方法和类方法

    java 操作 zip

    NULL 博文链接:https://ait.iteye.com/blog/919676

    java将文件夹压缩成zip,解压zip压缩包

    java控制指定路径下的文件夹压缩成zip格式。 java将zip压缩包解压成为文件夹。直接使用io流进行操作,不需借助其他jar包

    Java调用Zip类批量压缩多个文件.rar

    Java调用Zip类批量压缩多个文件,此前有一个是压缩单个文件,也可参考,相关代码中可找到此源码。  public class ZipDemo extends JFrame{  JFileChooser fileChooser; //文件选择器  JList fileList; //待...

    java,Blob字段操作,将图片或者文件保存到数据库中.zip

    java,Blob字段操作,将图片或者文件保存到数据库中.zip

    java ZIP 解压缩

    java语言操作解压缩文件。 /** * 数据压缩 * * @param data * @return * @throws Exception */ public static byte[] compress(byte[] data) throws Exception { ByteArrayInputStream bais = new ...

    Java操作ZIP文件,支持密码和中文

    winszipaes是Java语言下的ZIP文件操作接口,支持密码,但源代码不支持中文,该jar包对源码作了一点修改,使其支持中文,修改信息可以参照我的博客http://blog.csdn.net/zhangyihui1986/article/details/7724229或者...

    Java源码包100个设计实例.zip

    Java zip压缩包查看程序源码.rar java 一个消息发布网站.rar Java 数字签名、数字证书生成源码.rar Java 版的酒店系统,貌似完整.rar Java 电梯模拟程序 v2.0.rar Java 组播组中发送和接受数据实例 Java 飞机订票....

    java-json.zip

    java json.zip用于java后台操作json

    Java程序操作docker示例Demo.zip

    Java程序操作docker示例Demo.zip

    zip4j_1.3.2 - Java操作zip压缩文件接口最新版本

    Java操作zip压缩格式的开源项目,功能强大而且使用方便,能完全满足Java操作Zip压缩文件,官方网址为:http://www.lingala.net/zip4j/ 可以下载到jar包、源码和示例,好像没有提供API文档。 不过需要使用代理访问...

Global site tag (gtag.js) - Google Analytics