zoukankan      html  css  js  c++  java
  • Java用ZIP格式压缩和解压缩文件

    转载:java jdk实例宝典

    感觉讲的非常好就转载在这保存!

    java.util.zip包实现了Zip格式相关的类库,使用格式zip格式压缩和解压缩文件的时候,须要导入该包。

    使用zipoutputstream能够实现文件压缩,全部写入到zipoutputstream输入流中的数据,都会被ZIP格式压缩。

    每一个被压缩的文件或者文件夹在zip文件里都相应一个zipentry对象,每一个zipentry都有一个name属性,表示它相对于zip文件文件夹的相对路径,对于文件夹,路径以“/“结尾,对于文件,路劲以文件名称结尾

    zipoutputstream的putnextentry方法往zip文件里加入zipentry,紧接着写入到该文件zipoutputstream流中的数据都被保存到zipentry中,知道调用zipoutputstream的closeentry方法。

    zipfile表示一个zip文件,它的entries方法能获得zip文件里的zipentry集合。的奥zipentry的输入流。

    实例:

    package book.io;

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

    /**
     * 用ZIP压缩和解压缩文件或文件夹
     */
    public class CompressUtil {

     /**
      * 压缩文件或者文件夹
      * @param baseDirName  压缩的根文件夹
      * @param fileName   根文件夹下待压缩的文件或文件夹名,
      * 星号*表示压缩根文件夹下的所有文件。
      * @param targetFileName 目标ZIP文件
      */
     public static void zipFile(String baseDirName, String fileName,
       String targetFileName){
      //检測根文件夹是否存在
      if (baseDirName == null){
       System.out.println("压缩失败,根文件夹不存在:" + baseDirName);
       return;
      }
      File baseDir = new File(baseDirName);
      if (!baseDir.exists() || (!baseDir.isDirectory())){
       System.out.println("压缩失败,根文件夹不存在:" + baseDirName);
       return;
      }
      String baseDirPath = baseDir.getAbsolutePath();
      //目标文件
      File targetFile = new File(targetFileName);
      try{
       //创建一个zip输出流来压缩数据并写入到zip文件
       ZipOutputStream out =new ZipOutputStream(
         new FileOutputStream(targetFile));
       if (fileName.equals("*")){
        //将baseDir文件夹下的所有文件压缩到ZIP
        CompressUtil.dirToZip(baseDirPath, baseDir, out);
       } else {
        File file = new File(baseDir, fileName);
        if (file.isFile()){
         CompressUtil.fileToZip(baseDirPath, file, out);
        } else {
         CompressUtil.dirToZip(baseDirPath, file, out);
        }
       }
       out.close();
       System.out.println("压缩文件成功,目标文件名称:" + targetFileName);
      } catch (IOException e){
       System.out.println("压缩失败:" + e);
       e.printStackTrace();
      }
     }

     /**
      * 解压缩ZIP文件,将ZIP文件中的内容解压到targetDIR文件夹下
      * @param zipName 待解压缩的ZIP文件名称
      * @param targetBaseDirName 目标文件夹
      */
     public static void upzipFile(String zipFileName, String targetBaseDirName){
      if (!targetBaseDirName.endsWith(File.separator)){
       targetBaseDirName += File.separator;
      }
            try {
             //依据ZIP文件创建ZipFile对象
             ZipFile zipFile = new ZipFile(zipFileName);
                ZipEntry entry = null;
                String entryName = null;
                String targetFileName = null;
                byte[] buffer = new byte[4096];
                int bytes_read;
                //获取ZIP文件中全部的entry
                Enumeration entrys = zipFile.entries();
                //遍历全部entry
                while (entrys.hasMoreElements()) {
                 entry = (ZipEntry)entrys.nextElement();
                 //获得entry的名字
                 entryName =  entry.getName();
                 targetFileName = targetBaseDirName + entryName;
                 if (entry.isDirectory()){
                  //  假设entry是一个文件夹,则创建文件夹
                  new File(targetFileName).mkdirs();
                  continue;
                 } else {
                  // 假设entry是一个文件,则创建父文件夹
                  new File(targetFileName).getParentFile().mkdirs();
                 }

                 //否则创建文件
                 File targetFile = new File(targetFileName);
                 System.out.println("创建文件:" + targetFile.getAbsolutePath());
                 //打开文件输出流
                 FileOutputStream os = new FileOutputStream(targetFile);
                 //从ZipFile对象中打开entry的输入流
                 InputStream  is = zipFile.getInputStream(entry);
                 while ((bytes_read = is.read(buffer)) != -1){
                  os.write(buffer, 0, bytes_read);
                 }
                 //关闭流
                 os.close( );
                 is.close( );
                }
                System.out.println("解压缩文件成功!");
            } catch (IOException err) {
                System.err.println("解压缩文件失败: " + err);
            }
     }
     
     /**
      * 将文件夹压缩到ZIP输出流。
      */
     private static void dirToZip(String baseDirPath, File dir,
       ZipOutputStream out){
      if (dir.isDirectory()){
       //列出dir文件夹下全部文件
       File[] files  = dir.listFiles();
       // 假设是空文件夹
       if (files.length == 0){
        ZipEntry entry = new ZipEntry(getEntryName(baseDirPath, dir)); 
        // 存储文件夹信息
        try {
         out.putNextEntry(entry);
         out.closeEntry();
        } catch (IOException e) {
         e.printStackTrace();
        }
        return;
       }
       for (int i=0; i<files.length; i++){
        if (files[i].isFile()){
         //假设是文件,调用fileToZip方法
         CompressUtil.fileToZip(baseDirPath, files[i], out);
        } else {
         //假设是文件夹,递归调用
         CompressUtil.dirToZip(baseDirPath, files[i], out);
        }
       }
      }
     }
     /**
      * 将文件压缩到ZIP输出流
      */
     private static void fileToZip(String baseDirPath, File file,
       ZipOutputStream out){
      FileInputStream in = null;
      ZipEntry entry = null;
      // 创建复制缓冲区
      byte[] buffer = new byte[4096];   
      int bytes_read;
      if (file.isFile()){
       try {
        // 创建一个文件输入流 
        in = new FileInputStream(file); 
        // 做一个ZipEntry
        entry = new ZipEntry(getEntryName(baseDirPath, file)); 
        // 存储项信息到压缩文件
        out.putNextEntry(entry);
        // 复制字节到压缩文件
        while((bytes_read = in.read(buffer)) != -1){ 
         out.write(buffer, 0, bytes_read);
        }
        out.closeEntry();
        in.close();
        System.out.println("加入文件"
          + file.getAbsolutePath() + "被到ZIP文件里!");
       } catch (IOException e){
        e.printStackTrace();
       }
      }
     }
     /**
      * 获取待压缩文件在ZIP文件里entry的名字。即相对于跟文件夹的相对路径名
      * @param baseDirPath
      * @param file
      * @return
      */
     private static String getEntryName(String baseDirPath, File file){
      if (!baseDirPath.endsWith(File.separator)){
       baseDirPath += File.separator;
      }
      String filePath = file.getAbsolutePath();
      // 对于文件夹,必须在entry名字后面加上"/",表示它将以文件夹项存储。
      if (file.isDirectory()){
       filePath += "/";
      }
      int index = filePath.indexOf(baseDirPath);
      return filePath.substring(index + baseDirPath.length());
     }
     
     public static void main(String[] args) {
      //压缩C盘下的temp文件夹,压缩后的文件是C:/temp.zip
      String baseDirName = "C:/";
      String fileName = "temp/";
      String zipFileName = "C:/temp.zip";
      CompressUtil.zipFile(baseDirName, fileName, zipFileName);
      //将刚创建的ZIP文件解压缩到D盘的temp文件夹下
      System.out.println();
      fileName = "D:/temp";
      CompressUtil.upzipFile(zipFileName, fileName);
     }
    }

  • 相关阅读:
    我认知的javascript之函数调用
    table 的宽度设置无效
    【转】微信读书排版引擎自动化测试方案
    RocksDB原理及应用
    ElasticSearch 架构及应用简介
    芝加哥大学论文写作指南 简述
    python 常用模块
    Flask-SQLAlchemy安装及设置
    selenium设置程序失败后重启
    获取临时IP加入临时列表使用
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4389237.html
Copyright © 2011-2022 走看看