转载: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);
 }
}

Java用ZIP格式压缩和解压缩文件相关推荐

  1. java putnextentry_Java对zip格式压缩和解压缩

    Java对zip格式压缩和解压缩 通过使用java的相关类可以实现对文件或文件夹的压缩,以及对压缩文件的解压. 1.1 ZIP和GZIP的区别 gzip是一种文件压缩工具(或该压缩工具产生的压缩文件格 ...

  2. JAVA 7z Seven Zip 压缩和解压文件

    JAVA 7z Seven Zip 压缩和解压文件 7-Zip是基于GNU LGPL协议发布的软件,通过全新算法使压缩比率大幅提升 本文主要讲解通过JAVA方式把文件压缩成7z文件和对7z文件进行解压 ...

  3. java.util.zip_[Java 基础] 使用java.util.zip包压缩和解压缩文件

    Java API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作. 我们可以使用该包中的方法,结合IO中的相关知识,进行文件的压缩和解压缩相关操作. Zi ...

  4. zip格式压缩和解压缩(支持中文和文件嵌套解压缩)

    我在公司项目过程需要用到zip文件的压缩与解压的功能,于是自己研究了一下,找了一些,自己写了一个压缩和解压缩的代码,支持中文,可以文件嵌套(注意其中所用的类是ant.jar中的包中的类,我用的是1.6 ...

  5. Java 的zip压缩和解压缩

    Java 的zip压缩和解压缩 好久没有来这写东西了,今天中秋节,有个东西想拿出来分享,一来是工作中遇到的问题,一来是和csdn问候一下,下面就分享一个Java中的zip压缩技术,代码实现比较简单,代 ...

  6. Java使用winrar压缩和解压缩文件

    Java使用winrar压缩和解压缩文件 2015-08-17| 发布: | 浏览: 740 |保存PDF Winrar可以使用命令行进行压缩和解压缩,如: 将D:/aa.doc 压缩为:aa.rar ...

  7. java 解压与压缩代码_Java实现多文件压缩和解压缩代码详解

    Java实现多文件压缩和解压缩代码 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStre ...

  8. java ant解压缩_java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解

    java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解 发布于 2020-4-7| 复制链接 摘记: java ant包中的org.apache.tools.zip实现 ...

  9. python怎样压缩和解压缩ZIP文件

    python怎样压缩和解压缩ZIP文件(转) 有时我们需要在 Python 中使用 zip 文件,而在1.6版中,Python 就已经提供了 zipfile 模块可以进行这样的操作.不过 Python ...

最新文章

  1. 实用Jquery开发自己的插件
  2. 某程序员吐槽:潮汕女朋友狮子大开口要18万8彩礼,而且只能男友父母出,不能男友出!...
  3. 【疼逊】致广大QQ用户的一封信
  4. 前端入门CSS(3)
  5. fiddler手机端抓包配置
  6. 基于CentOS7,MySQL5.7的主从复制架构搭建实战
  7. Linux SHELL 学习随笔--for 循环
  8. 中医移动医疗_人工智能为中医赋能 上海祉云医疗将再次亮相2021健博会北京展...
  9. VS2015sql本地服务器为空,详解VS2015自带LocalDB数据库用法实例
  10. oracle的ebs系统,EBS系统简介
  11. linux系统分区磁盘,Linux 操作系统手动磁盘分区详细说明
  12. 一分钟读懂dB、dBm、dBw的区别
  13. 聊聊千古名方逍遥丸【转载】
  14. 增加关键词密度不要堆积
  15. PCB板各层定义及解释
  16. 维修记录 - 格兰仕光波炉
  17. Java+JSP+Mysql+Tomcat实现Web图书管理系统
  18. html 中 table tr td br 什么意思 是什么的缩写
  19. [深度学习][原创]使用labelImg+yolov5完成所有slowfast时空动作检测项目-训练测试篇
  20. Verilog硬件描述语言

热门文章

  1. Windnd模块接口
  2. 使用Primer Premier 5软件设计引物
  3. NXP(Freescale) QorIQ T2080 SRIO使用
  4. sybase 与mysql_sybase 和 mysql 转换问题
  5. python爬取安居客二手房网站数据
  6. 产品经理必备的软件工具
  7. 爬虫系列1:Requests+Xpath 爬取豆瓣电影TOP
  8. Sysinternals Suite Tools 简介
  9. App Store 4.3 大礼包被拒 ,马甲包制作方案
  10. SAP S/4HANA WM模块前台操作详解--盘点作业