`

利用java.util.zip压缩文件

阅读更多

package test;

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;
/*
 import org.apache.tools.zip.ZipOutputStream;  
 import org.apache.tools.zip.ZipEntry;  
 import org.apache.tools.zip.ZipFile; */

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 用ZIP压缩和解压缩文件或目录
 */
public class Zip {

 private final static Log log = LogFactory.getLog(Zip.class);

 /**
  * 压缩文件或者目录
  *
  * @param baseDirName
  *            压缩的根目录
  * @param fileName
  *            根目录下待压缩的文件或文件夹名, 星号*表示压缩根目录下的全部文件。
  * @param targetFileName
  *            目标ZIP文件
  */
 public static void zipFile(String baseDirName, String targetFileName) {
  // 检测根目录是否存在
  if (baseDirName == null) {
   log.info("压缩失败,根目录不存在:" + baseDirName);
   return;
  }
  File file = new File(baseDirName);
  if (!file.exists()) {
   log.info("压缩失败,文件不存在:" + baseDirName);
   return;
  }

  String baseDirPath = file.getAbsolutePath();
  // 目标文件
  File targetFile = new File(targetFileName);

  try {
   // 创建一个zip输出流来压缩数据并写入到zip文件
   ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
     targetFile));
   if (file.isFile()) {
    Zip.fileToZip(baseDirPath, file, out);
   } else {
    Zip.dirToZip(baseDirPath, file, out);
   }
   out.close();
   log.info("压缩文件成功,目标文件名:" + targetFileName);
  } catch (IOException e) {
   log.info("压缩失败:" + 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();
    System.out.println(entryName);
    targetFileName = targetBaseDirName + entryName;

    if (entry.isDirectory()) {
     // 如果entry是一个目录,则创建目录
     new File(targetFileName).mkdirs();
     continue;
    } else {
     // 如果entry是一个文件,则创建父目录
     new File(targetFileName).getParentFile().mkdirs();
    }

    File targetFile = new File(targetFileName);
    FileOutputStream os = new FileOutputStream(targetFile);
    InputStream is = zipFile.getInputStream(entry);
    while ((bytes_read = is.read(buffer)) != -1) {
     os.write(buffer, 0, bytes_read);
    }
    // 关闭流
    os.close();
    is.close();
   }
   log.info("解压缩文件成功!");
  } 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方法
     Zip.fileToZip(baseDirPath, files[i], out);
    } else {
     // 如果是目录,递归调用
     Zip.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();
    log.info("添加文件" + 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";
   */
  String baseDirName = "E:/plat";
  String zipFileName = "E:/aa.zip";
  Zip.upzipFile("d:/杂志.zip", "d:/");
  Zip.zipFile("e:/123", "e:/123.zip");
  // 将刚创建的ZIP文件解压缩到D盘的temp目录下
  // System.out.println();
  /*
   * String zipFileName = "E:/plat.zip"; String fileName = "E:/plat1";
   * upzipFile(zipFileName,fileName);
   */
  // CompressUtil.zipFile(baseDirName, fileName, zipFileName);
 }
}

分享到:
评论

相关推荐

    用java.util.zip包现数据压缩与解压

    本文将通过一系列的示例来详细介绍如何利用 Java 中的 `java.util.zip` 包进行数据的压缩与解压操作。此外,还将探讨这一技术在网络传输中的应用。 #### 数据压缩算法简介 在深入讨论具体实现之前,我们先简要了解...

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

    总结一下,`java.util.zip` 包提供了解压缩和压缩文件的强大功能,这对于任何需要处理ZIP文件的Java开发者来说都是必不可少的工具。无论你是想解压下载的库,还是想将项目文件打包成ZIP,这个包都能提供简洁且高效的...

    根据java.util.zip源码修改zip支持中文

    在Java编程语言中,`java.util.zip`包提供了对压缩文件格式的支持,如ZIP和GZ等。然而,早期版本的Java在处理包含非ASCII字符(例如中文字符)的文件名时存在一些问题。这是因为ZIP文件格式本身是支持Unicode编码的...

    zipper.zip_java zipper_java.util包_zip_遗传算法

    `Zipper`类是一个自定义的类,它利用了`java.util.zip`包中的功能来实现文件或文件夹的压缩功能。在本文中,我们将深入探讨`java.util.zip`包中的关键组件以及如何使用它们创建一个类似`Zipper`的类。 首先,`java....

    java+apache完成zip压缩源码(包括修改后的java.util.zip下的源码)

    `java.util.zip`包提供了基础的压缩功能,但默认情况下,它可能无法正确处理包含中文文件名的情况。为了解决这个问题,开发者有时需要对原始源码进行修改,以确保中文文件名在压缩和解压缩过程中能被正确编码和解析...

    利用java.util.zip 包中提供的类来实现压缩和解压zip 格式文件的功能.rar

    在Java编程语言中,`java.util....通过以上代码,你可以实现使用`java.util.zip`包来压缩和解压缩ZIP文件的基本功能。需要注意的是,实际应用中可能需要处理更多细节,比如错误处理、文件权限检查、递归处理子目录等。

    tomcat启动报错:java.util.zip.ZipException的解决方法

    在使用Apache Tomcat服务器时,有时会遇到启动异常的情况,其中一种常见的错误是`java.util.zip.ZipException`。这个异常通常表明在处理ZIP或JAR文件时遇到了问题,可能是因为文件损坏、格式不正确或者无法打开。在...

    FileUpload文件上传组件与java.util.zip解压缩类

    博文链接:https://onlyLove.iteye.com/blog/228044

    Java把文件压缩成zip

    本文主要介绍如何使用Java实现文件的ZIP压缩功能,并提供了完整的代码示例。通过学习本文,你可以掌握以下几个知识点: 1. 使用`java.util.zip`包中的类进行文件压缩。 2. 如何创建ZIP输出流并写入文件数据。 3. ...

    (JAVA)利用Java实现zip压缩.解压缩.rar_decompress rar java_zip 压缩

    在提供的资源中,"www.pudn.com.txt"可能是文档或链接,用于提供更多的学习资源或者相关背景信息,而"(JAVA)利用Java实现zip压缩.解压缩.txt"可能是教程文本,详细解释了上述的压缩和解压缩过程。 总的来说,Java中...

    java生成.zip包,解压缩.zip

    另外,`java.util.zip`包并不支持所有`.zip`文件格式的特性,比如压缩设置和加密。对于更复杂的需求,可以考虑使用第三方库,如Apache Commons Compress或IZip。 最后,`生成zip包代码.txt`和`解压缩zip包.txt`文件...

    详解Java无需解压直接读取Zip文件和文件内容

    Java无需解压直接读取Zip文件和文件内容是Java语言中的一种常见操作,通过使用java.util.zip包中的ZipFile、ZipInputStream和ZipEntry类,我们可以轻松地读取Zip文件和文件内容。下面,我们将详细介绍如何使用Java...

    使用java代码替换zip内的文件.docx

    `ZipInputStream`和`ZipOutputStream`是Java的`java.util.zip`包中的类,分别用于读取和写入ZIP文件。`ZipInputStream`可以从输入流中读取ZIP格式的数据,而`ZipOutputStream`则可以将数据写入ZIP格式的输出流。 ...

    java 中 zip压缩文件解压工具类

    本文将深入探讨如何使用Java来处理ZIP文件,特别是针对标题所提及的“java 中 zip压缩文件解压工具类”。我们将讨论核心的Java API,如`java.util.zip`包中的类,并通过一个名为`CompressFileUtils`的工具类来展示...

    java android zip解压缩(解决压缩中文乱码问题)

    本篇文章将深入探讨如何在Android平台上解决Java ZIP库在解压缩中文文件时出现的乱码问题。 首先,我们要明白乱码问题的根源。在文件的压缩和解压缩过程中,文件名通常被编码为字节序列,这个序列取决于原始文件名...

    java获取压缩文件的名称并解压

    在Java编程中,处理压缩文件,如ZIP格式的文件,是一项常见的任务。本文将深入探讨如何使用Java来获取ZIP文件的名称以及如何高效地解压缩这些文件,特别是通过多线程来提高性能。 首先,我们需要引入Java的内置库`...

    java解压zip压缩文件

    在Java编程环境中,解压ZIP压缩文件是一项常见的任务,它涉及到文件I/O操作以及对ZIP文件格式的理解。本文将深入探讨如何使用Java实现这一功能,同时也会提及`UnZip.java`和`UnZip2.java`这两个文件可能包含的实现...

    java实现的解压与压缩 zip和rar类型的

    在Java编程环境中,处理压缩和解压缩文件是常见的任务,主要涉及到两个标准库中的类:`java.util.zip`和第三方库如Apache Commons Compress。本文将深入探讨如何使用Java实现ZIP和RAR类型的压缩与解压操作,以及相关...

    java 压缩/解压 .zip/.rar/.tar 文件

    // 解压缩.TAR文件 TarInputStream tarIn = new TarInputStream(new FileInputStream("input.tar")); TarEntry entry; while ((entry = tarIn.getNextEntry()) != null) { File outputFile = new File("output_...

    zip 压缩 文件 Java

    在Java编程语言中,处理ZIP压缩文件是一项常见的任务,它涉及到文件和目录的打包与解压。本篇文章将深入探讨如何使用Java实现ZIP文件的压缩和解压缩操作,以及涉及的相关知识点。 首先,理解ZIP文件格式是基础。ZIP...

Global site tag (gtag.js) - Google Analytics