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

 }

}