转载: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对zip格式压缩和解压缩

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

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

    reference :  http://www.open-open.com/lib/view/open1381641653833.html Java API中的import java.util.zip ...

  3. Java ZIP压缩和解压缩文件(解决中文文件名乱码问题)

    Java ZIP压缩和解压缩文件(解决中文文件名乱码问题) 学习了:http://www.tuicool.com/articles/V7BBvy 引用原文: JDK中自带的ZipOutputStrea ...

  4. Java 的zip压缩和解压缩

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

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

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

  6. Linux常用命令学习3---(文件的压缩和解压缩命令zip unzip tar、关机和重启命令shutdown reboot……)

    1.压缩和解压缩命令    常用压缩格式:.zip..gz..bz2..tar.gz..tar.bz2..rar .zip格式压缩和解压缩命令        zip 压缩文件名 源文件:压缩文件   ...

  7. IO操作之使用zip包压缩和解压缩文件

    转自:http://www.cdtarena.com/java.html​​Java API中的import java.util.zip.*;包下包含了Java对于压缩文件的所有相关操作. 我们可以使 ...

  8. 【转】Java压缩和解压文件工具类ZipUtil

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  9. java采用zip方式实现String的压缩和解压缩CompressStringUtil类

    CompressStringUtil类:不多说,直接贴代码: /** * 压缩 * * @param paramString * @return */ public static final byte ...

随机推荐

  1. 2013成都邀请赛J称号||HDU4725 The Shortest Path in Nya Graph(spfa+slf最短的优化)

    职务地址:HDU 4725 这题卡了好长时间了,建图倒是会建,可是不会最短路的算法优化,本以为都须要堆去优化的,打算学了堆之后再来优化.可是昨晚CF的一道题..(那题也是不优化过不了..)然后我就知道 ...

  2. 【Shell剧本练习】得出的结论是当前用户

    推断是否当前用户root.假设是暗示root用户,假设而不是提示对于普通用户 #!/bin/bash #title: testus.sh #author: orangleliu #date: 2014 ...

  3. 学习swift语言的快速入门教程推荐

    随着苹果产品越来越火爆,苹果新推出的swift必定将在很大程度上代替oc语言.学好swift语言,对于IOS工程师来讲,已经是一门必备技能. 有一些比较好的英文版教程,值得学习. 1. Swift T ...

  4. JS达到Web指定保存的和打印功能的内容

    背景 首先,说说文章的背景.近期手中的一个项目,因为需求中要求提供Web界面的打印功能.当然假设没有打印机,还能够提供保存到本地.项目组长把这个"小任务"分给了我.本着努力为组长分 ...

  5. JGroups 入门实践(转)

    前言 JGroups是一个开源的纯java编写的可靠的群组通讯工具.其工作模式基于IP多播,但可以在可靠性和群组成员管理上进行扩展.其结构上设计灵活,提供了一种灵活兼容多种协议的协议栈. JGroup ...

  6. SystemTrayDemo

    遗留问题:win7  java.awt.TrayIcon的displayMessage方法没有生效,通知消息不能正常弹出. 许多桌面环境都有一个区域用于放置在后台运行的程序的图标,这些程序偶尔会将某些 ...

  7. 《web全栈工程师的自我修养》阅读笔记

    在买之前以为这本书是教你怎么去做一个web全栈工程师,以及介绍需要掌握的哪些技术的书,然而看的过程中才发现,是一本方法论的书.读起来的感觉有点像红衣教主的<我的互联网方法论>,以一些自己的 ...

  8. Android供TextView添加多个点击文字

    我们使用社会性软件的过程中会或多或少像别人的帖子点,图. : 能够看到用户页面显示出来的仅仅是点了赞的用户的名称,点击这些名称能够进入到该用户的主页.我们就来实现相似的效果.直接上代码吧. @Over ...

  9. 分布式数据库中间件–(2) Cobar与client握手身份验证

    Cobar启动完毕,监听特定端口.整个认证的流程图: NIOAcceptor类继承自Thread类,该类的对象会以线程的方式执行,进行连接的监听. NIOAcceptor启动的初始化步骤例如以下: 1 ...

  10. 与我一起extjs5(09--其定义菜单2)

    跟我一起学extjs5(09--自己定义菜单2)         这一节来定义另外三种类型的菜单类. 首先定义菜单button类.文件放于app/view/main/region文件夹以下,文件名称为 ...