`

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

 

分享到:
评论

相关推荐

    java自带压缩方式的性能比较

    它通常用于单个文件的压缩,支持在线压缩和解压缩,且文件头包含有关压缩文件的信息,如时间戳和文件类型。 2. Zip:Zip是另一种流行的压缩格式,它可以将多个文件和目录打包到一个单一的归档文件中。Zip使用多种...

    压缩和解压缩字符串

    在Java编程语言中,压缩和解压缩字符串是常见的数据处理任务,主要应用于减少存储空间或在网络上传输数据时减小带宽需求。本篇将详细探讨两种主要的方法:Inflater和Deflater,它们分别用于解压缩和压缩字符串。 ...

    java算法,实现压缩及解压缩

    以上介绍了如何使用Java实现文件的压缩和解压缩功能。通过`java.util.zip`包提供的工具类,可以方便地实现文件压缩与解压缩操作。需要注意的是,在实际应用过程中还需要考虑异常处理、资源释放等细节问题,以确保...

    使用Java实现文件的压缩和解压缩.doc

    在Java编程中,实现文件的压缩和解压缩是一项常见的任务,这通常涉及到对`java.util.zip`包的使用。`ZipOutputStream`和`ZipInputStream`是Java标准库提供的两个关键类,它们分别用于文件的压缩和解压缩。然而,需要...

    利用Java实现zip压缩解压缩

    本文将详细介绍如何使用 Java 实现 ZIP 文件的压缩和解压缩功能,并通过具体的代码示例来展示其实现过程。 #### Java 中 ZIP 文件处理的核心类 Java 提供了两个核心类来处理 ZIP 文件:`ZipOutputStream` 和 `...

    quicklz cocos2dx 压缩 字符串压缩

    ZIP是一种更通用的压缩格式,适合大型文件,而QuickLZ则更适合需要快速压缩和解压缩的场景,如游戏中的资源管理。 总结起来,Cocos2d-x开发者可以通过集成QuickLZ库来实现高效字符串压缩,从而优化游戏的性能和资源...

    pako gzip 压缩和解压缩(支持中文)

    gzip是一种广泛使用的文件压缩格式,它基于deflate算法,并添加了额外的头部和尾部信息,以便于识别和解压。在JavaScript中,使用pako库进行gzip压缩和解压缩非常简单: 1. **压缩**:使用`pako.gzip()`方法,将未...

    java实现文件的压缩解压

    在Java中,可以利用标准库中的`java.util.zip`包来进行文件的压缩和解压缩操作。这个包提供了多种类和接口,如`ZipOutputStream`、`ZipEntry`等,可以非常方便地实现压缩功能。 #### 文件压缩示例 下面是一个简单的...

    java ZIP压缩/解压缩(同时加解密)解决方案(一)

    Java 提供了多种方式来实现 ZIP 文件的压缩和解压缩功能,同时也支持对 ZIP 文件进行加密保护。本文将详细介绍一个具体的 Java 实现案例,并对其关键代码进行深入分析。 #### 二、主要功能模块解析 ##### 2.1 `...

    用java实现文件的压缩与解压缩(支持中文)

    以下是一段示例代码,它演示了如何使用Apache的工具类进行文件的压缩和解压缩: ```java import java.io.*; import java.util.*; import java.util.zip.*; import org.apache.tools.zip.*; /** * 提供对单个文件...

    zip压缩算法

    在编程中实现ZIP压缩和解压缩,可以使用开源库如Java的`java.util.zip`包,C#的`System.IO.Compression`命名空间,或者Python的`zipfile`模块。这些库已经实现了ZIP格式和Deflate算法,开发者只需要调用相应的API...

    文件夹zip压缩

    总结,文件夹的ZIP压缩和解压缩是日常IT工作中常见的操作,涉及到文件系统操作、数据压缩和可能的加密。`zipDir`和`Unzipdir`函数代表了这一过程的核心步骤,即创建和解析ZIP文件。理解和掌握这些概念对于提升文件...

    lzw.zip_lzw_lzw java_zip

    总结来说,这个压缩包提供了一个用Java实现的LZW压缩算法,包括了字典管理、数据压缩和解压缩、以及可能的用户界面和交互元素。这些文件可以作为一个学习资源,用于理解和实现LZW算法,或者用于在Java项目中集成LZW...

    JAVA 压缩、解压缩Demo

    在Java编程语言中,压缩和解压缩文件是常见的任务,特别是在处理大量数据或者需要节省存储空间时。本篇文章将深入探讨如何使用Java实现文件、目录的压缩与解压缩功能,并介绍一个具体的`ZipUtils.java`类的实现示例...

    java实现压缩和解压.doc

    对于GZIP格式,我们使用`GZIPOutputStream`来压缩数据,以下是一个压缩字符串的例子: ```java import java.io.*; import java.util.zip.*; public class GzipExample { public static void main(String[] args)...

    语言 Java C++等语言LZMA压缩算法示例源码包

    在提供的"okbase.net"文件中,可能包含了使用Java、C++和C实现的LZMA压缩算法的源代码示例。通过这些示例,开发者可以深入理解LZMA算法的实现细节,学习如何在实际项目中应用这些语言进行数据压缩。分析这些示例源码...

    lzw_encode_decode.zip_LZW文件压缩_lzw_lzw压缩

    - 源代码文件:可能用C、Python或Java等编程语言实现的LZW压缩和解压缩程序,展示了算法的具体实现。 - 示例数据:用于测试算法的文本文件或其他类型的数据文件。 - 说明文档:详细解释LZW算法原理、代码实现以及...

    文件压缩与解压缩实践docx

    在Java中,`java.util.zip.GZIPOutputStream`和`java.util.zip.GZIPInputStream`类提供了对GZIP压缩和解压缩的支持。 3. 开发环境 本文档提到的程序是在JBuilder2006集成开发环境中用Java语言实现的,利用Java的IO...

Global site tag (gtag.js) - Google Analytics