`

Java用ZIP格式压缩和解压缩字符串和文件

    博客分类:
  • java
 
阅读更多

下面是压缩解压字符串的:

http://blog.csdn.net/kalision/article/details/7864407

 

下面是压缩解压文件的:

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);
 }
}

 

分享到:
评论

相关推荐

    在iOS使用ZipArchive压缩和解压缩文件

    一个在iOS使用ZipArchive实现压缩和解压缩文件的demo

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

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

    zip 压缩 文件 Java

    zip 压缩 文件 Java zip 压缩 文件 Java zip 压缩 文件 Java zip 压缩 文件 Java

    Java实现zip的压缩和解压缩操作

    Java标准库的java.util.zip包通常适用于简单的ZIP格式压缩与解压缩,Apache Commons Compress和Java Zip4j提供了更多的压缩格式和功能选项。对于大型数据集和高性能要求的场景,还可以考虑使用专门的压缩工具或算法...

    java解压zip压缩文件

    java解压zip压缩文件,读取压缩文件中的内容并输出到输出文件中。

    java.util.zip 解压缩文件,ZIP格式压缩文件.rar

    Java解压缩文件,并以ZIP格式压缩文件,主要是使用java.util.zip 包中的类来实现解压、压缩文件功能,如果你对这个类并不太熟悉,你正好可以参考一下这个类是如何用的。

    java实现压缩和压缩zip格式文件的功能

    java实现压缩和压缩zip格式文件的功能,网络上看到的,觉得不错上传出来,供大家一起共同分享学习。

    java压缩zip文件解决中文乱码问题

    java压缩文件成zip实现无乱码 内置类与jar包

    95.java拼接字符串案例.zip

    95.java拼接字符串案例.zip95.java拼接字符串案例.zip95.java拼接字符串案例.zip95.java拼接字符串案例.zip95.java拼接字符串案例.zip95.java拼接字符串案例.zip95.java拼接字符串案例.zip95.java拼接字符串案例.zip...

    89.java字符串方法.zip

    89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符...

    JAVA文件压缩与解压缩实践,java解压缩zip文件,Java源码.zip

    JAVA文件压缩与解压缩实践,java解压缩zip文件,Java源码

    java zip文件压缩与解压缩

    java zip文件的压缩与解压缩,支持中文 使用apache的工具包可设置字符编码

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

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

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

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

    Java把文件压缩成zip

    Java把文件压缩成zip,粘贴在项目中即可使用

    87.java中字符串的比较.zip

    87.java中字符串的比较.zip87.java中字符串的比较.zip87.java中字符串的比较.zip87.java中字符串的比较.zip87.java中字符串的比较.zip87.java中字符串的比较.zip87.java中字符串的比较.zip87.java中字符串的比较.zip...

    84.java中字符串的特点.zip

    84.java中字符串的特点.zip84.java中字符串的特点.zip84.java中字符串的特点.zip84.java中字符串的特点.zip84.java中字符串的特点.zip84.java中字符串的特点.zip84.java中字符串的特点.zip84.java中字符串的特点.zip...

    java 生成zip压缩文件

    java 生成zip压缩文件 java 生成zip压缩文件

    29.java字符串+操作.zip

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

    96.java字符串反转案例.zip

    96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip...

Global site tag (gtag.js) - Google Analytics