`
yefei
  • 浏览: 124251 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ZIP压缩文件的解压

F# 
阅读更多

//UnZip1和UnZip2两个程序使用了两种方式解压zip文件
// Zip程序用来将文件压缩为zip文件

// 解压缩时
// zip文件本身的文件名可以包含中文,zip文件内的文件的内容也可以包含中文
// 但在zip文件内不能有名称包含中文的文件和目录,否则解压程序会报错
// 这是Java类库的一个漏洞,对zip文件内的文件和目录的名称的解读方式有问题
// 可以通过修改ZipInputStream类解决这个问题

// 压缩时,如果被压缩文件中有名称包含中文的文件或目录
// 则在WinZip或WinRar中查看压缩后的zip文件时,对应文件或目录的名称显示为乱码
// 这是Java类库的一个漏洞,压缩文件时对文件和目录的名称的编码方式作了转换
// 可以通过修改ZipOutputStream类解决这个问题

// 上机运行这三个程序
// 根据这三个程序,编写一个满足下面要求的可以压缩和解压缩zip文件的程序

// 程序启动后
// (1)选择是压缩还是解压缩zip文件,或是退出程序
// (2)如果选择压缩
// 输入要压缩的文件或目录,可以输入多个,文件要包含扩展名
// 输入压缩文件名,不包含扩展名
// 显示压缩过程并将压缩过程记入日志文件
// 压缩完毕转向(1)
// (3)如果选择解压缩
// 输入要解压缩的文件,只能输入一个,不包含扩展名
// 输入放置解压后文件的目录
// 选择解压缩方式:UnZip1或UnZip2
// 显示解压缩过程并将解压缩过程记入日志文件
// 解压缩完毕转向(1)
// (4)如果选择退出程序,直接退出程序

// 日志文件格式要求
// (1)日志文件使用文本文件,以"log"为扩展名
// (2)日志记录内容包括
// 程序启动和退出
// 执行的操作(压缩、解压缩)和操作过程
// 错误和异常说明
// (3)程序启动和退出记录以日期时间开头
// 执行操作(压缩、解压缩)记录以日期时间开头
// (4)每条日志记录以换行为分隔符
// 每次程序运行的记录以"一个空行+一行"*"+一个空行"为分隔符
// 每次操作(压缩、解压缩)的记录以一个空行为分隔符

import java.io.*;
import java.util.zip.*;
import java.util.Enumeration;

class UnZip1 {
 public void unZip(String filePath, String dirPath)

 // filePath是需要解压的zip文件的路径,可以是绝对或相对路径,包含文件的扩展名
 // dirPath是用来放置解压后文件的目录的路径,可以是绝对或相对路径
 {
  File f = new File(filePath);
  File dir = new File(dirPath);
  filePath = f.getAbsolutePath();

  System.out.println("将" + filePath + "解压到" + dir.getAbsolutePath());

  if (!f.isFile())
   System.out.println(filePath + "文件不存在");
  else {
   String zipFileName = f.getName();
   System.out.println(zipFileName + "开始解压");

   if (!dir.isDirectory())
    dir.mkdirs(); // 创建放置解压后文件的目录

   try {
    ZipInputStream in = new ZipInputStream(new FileInputStream(f));
    FileOutputStream out;
    byte buf[] = new byte[1024]; // 解压缓冲区
    ZipEntry zipEntry; // 获取压缩文件中的文件或目录
    String zipEntryName;
    File file, parent;
    int len;

    while ((zipEntry = in.getNextEntry()) != null) {
     zipEntryName = zipEntry.getName();
     System.out
       .println(zipFileName + "/" + zipEntryName + "被解压");

     if (zipEntry.isDirectory()) // 如果读出的是目录
      new File(dir, zipEntryName).mkdirs();
     else {
      file = new File(dir, zipEntryName);

      // 如果读出的这个文件所在目录尚未创建
      parent = file.getParentFile();
      if (!parent.exists())
       parent.mkdirs();

      // 如果该文件已存在,直接覆盖
      // 如果该文件不存在,自动创建
      out = new FileOutputStream(file);

      while ((len = in.read(buf, 0, 1024)) != -1)
       out.write(buf, 0, len);

      out.close();
     }
    }

    in.close();
    System.out.println(zipFileName + "解压完毕");
   } catch (Exception e) {
    System.out.println(e);
    System.out.println(zipFileName + "解压失败");
   }
  }
 }

 public static void main(String args[]) {
  new UnZip1().unZip(args[0], args[1]);
 }
}

class UnZip2 {
 public void unZip(String filePath, String dirPath)
 // filePath是需要解压的zip文件的路径,可以是绝对或相对路径,包含文件的扩展名
 // dirPath是用来放置解压后文件的目录的路径,可以是绝对或相对路径
 {
  File f = new File(filePath);
  File dir = new File(dirPath);
  filePath = f.getAbsolutePath();

  System.out.println("将" + filePath + "解压到" + dir.getAbsolutePath());

  if (!f.isFile())
   System.out.println(filePath + "文件不存在");
  else {
   String zipFileName = f.getName();
   System.out.println(zipFileName + "开始解压");

   if (!dir.isDirectory())
    dir.mkdirs(); // 创建放置解压后文件的目录

   try {
    ZipFile zipFile = new ZipFile(f);
    Enumeration enu = zipFile.entries();

    InputStream in;
    FileOutputStream out;
    byte buf[] = new byte[1024]; // 解压缓冲区
    ZipEntry zipEntry; // 获取压缩文件中的文件或目录
    String zipEntryName;
    File file, parent;
    int len;

    while (enu.hasMoreElements()) {
     zipEntry = (ZipEntry) enu.nextElement();
     zipEntryName = zipEntry.getName();
     System.out
       .println(zipFileName + "/" + zipEntryName + "被解压");

     if (zipEntry.isDirectory()) // 如果读出的是目录
      new File(dir, zipEntryName).mkdirs();
     else {
      in = zipFile.getInputStream(zipEntry);
      file = new File(dir, zipEntryName);

      // 如果读出的这个文件所在目录尚未创建
      parent = file.getParentFile();
      if (!parent.exists())
       parent.mkdirs();

      // 如果该文件已存在,直接覆盖
      // 如果该文件不存在,自动创建
      out = new FileOutputStream(file);

      while ((len = in.read(buf, 0, 1024)) != -1)
       out.write(buf, 0, len);

      in.close();
      out.close();
     }
    }

    zipFile.close();
    System.out.println(zipFileName + "解压完毕");
   } catch (Exception e) {
    System.out.println(e);
    System.out.println(zipFileName + "解压失败");
   }
  }
 }

 public static void main(String args[]) {
  new UnZip2().unZip(args[0], args[1]);
 }
}

class Zip {
 public void zipFile(File f, int filesParentAbsolutePathLength,
   ZipOutputStream out) throws Exception {
  String filePath = f.getAbsolutePath();
  System.out.println(filePath + "被压缩");
  String zipEntryName = filePath.substring(filesParentAbsolutePathLength);

  if (f.isDirectory()) {
   ZipEntry zipEntry = new ZipEntry(zipEntryName + "/");
   out.putNextEntry(zipEntry);

   File temp[] = f.listFiles();
   int num = temp.length;

   for (int i = 0; i < num; i++)
    zipFile(temp[i], filesParentAbsolutePathLength, out);
  } else {
   ZipEntry zipEntry = new ZipEntry(zipEntryName);
   out.putNextEntry(zipEntry);

   FileInputStream in = new FileInputStream(f);
   byte buf[] = new byte[1024]; // 压缩缓冲区
   int len;

   while ((len = in.read(buf, 0, 1024)) != -1)
    out.write(buf, 0, len);

   in.close();
  }
 }

 public void zip(String filePaths[], int num, String zipFilePath)
 // filePaths数组存放需要压缩的文件或目录的路径,可以是绝对或相对路径,文件要包含扩展名
 // zipFilePath是压缩后的zip文件的路径,可以是绝对或相对路径,包含文件的扩展名
 {
  File files[] = new File[num];
  int i;
  for (i = 0; i < num; i++) {
   files[i] = new File(filePaths[i]);
   filePaths[i] = files[i].getAbsolutePath();
  }

  File zipFile = new File(zipFilePath);

  String str = "";
  for (i = 0; i < num; i++) {
   str += filePaths[i];

   if (i < num - 1)
    str += "、";
  }

  System.out.println("将" + str + "压缩到" + zipFile.getAbsolutePath());

  File parent, temp = null;
  boolean flag = true;

  for (i = 0; i < num; i++) {
   if (!files[i].exists()) {
    System.out.println(filePaths[i] + "不存在");
    flag = false;
   }

   if (i == 0)
    temp = files[i].getAbsoluteFile().getParentFile();
   else {
    parent = files[i].getAbsoluteFile().getParentFile();
    if (!parent.equals(temp)) {
     System.out.println(filePaths[i] + "与" + filePaths[0]
       + "不在同一目录下");
     flag = false;
    }
   }
  }

  if (flag) {
   String zipFileName = zipFile.getName();
   System.out.println("开始生成" + zipFileName);

   // 如果压缩后的zip文件所在目录尚未创建
   parent = zipFile.getAbsoluteFile().getParentFile();
   if (!parent.exists())
    parent.mkdirs();

   // 对于硬盘某个分区的根目录,getAbsolutePath()方法返回值最后是"/"或"\"(如C:\)
   // 对于非硬盘分区根目录的目录,getAbsolutePath()方法返回值最后是目录名,没有"/"或"\"(如C:\abc)
   // 下面这段代码的作用是:
   // 对于指定的绝对路径字符串,如果其最后一个字符不是"/"或"\"
   // 把它变成最后一个字符是"/"或"\"的绝对路径字符串
   String filesParentAbsolutePath = temp.getAbsolutePath();
   int filesParentAbsolutePathLength = filesParentAbsolutePath
     .length();
   if (!filesParentAbsolutePath.endsWith("/")
     && !filesParentAbsolutePath.endsWith("\\"))
    filesParentAbsolutePathLength++;

   try {
    ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
      zipFile));

    for (i = 0; i < num; i++)
     zipFile(files[i], filesParentAbsolutePathLength, out);

    out.close();
    System.out.println(zipFileName + "生成完毕");
   } catch (Exception e) {
    System.out.println(e);
    System.out.println(zipFileName + "生成失败");
   }
  }
 }

 public static void main(String args[]) {
  int num = args.length;
  new Zip().zip(args, num - 1, args[num - 1]);
 }
}

分享到:
评论

相关推荐

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

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

    Android将assets中的zip压缩文件解压到SD卡

    在Android开发中,有时我们需要将应用内部的资源文件,如ZIP压缩文件,解压到外部存储(即SD卡)上,以便用户可以访问或使用这些数据。本文将详细讲解如何实现这一功能,主要涉及Android权限管理、文件操作以及ZIP...

    ZIP压缩和解压类

    2. `extract_zip(zip_file, dest_dir)`: 接收ZIP文件名`zip_file`和目标解压目录`dest_dir`,将ZIP文件解压到指定目录,保持原有的文件结构。 这两个函数内部可能涉及以下步骤: - 遍历文件/目录:对源目录进行...

    zip文件压缩解压源码 (c++)

    在IT行业中,压缩和解压缩文件是常见的操作,特别是在存储和传输大量数据时。本文将深入探讨使用C++实现zip文件的压缩与解压缩技术,基于提供的文件名列表:XUnzip.cpp、XZip.cpp、XUnzip.h、XZip.h。 首先,`...

    C++ Zlib库实现zip文件压缩解压(支持递归压缩)

    在IT领域,尤其是在软件开发中,压缩和解压缩文件是一项常见的任务。`C++`作为一门强大且广泛应用的编程语言,提供了多种库来处理这样的需求。`Zlib`库就是一个非常著名的开源库,专用于数据压缩和解压缩,广泛应用...

    VB6.0调用 DLL版ZIP压缩文件夹目录和解压ZIP文件

    VB6.0调用 DLL版ZIP压缩文件夹目录和解压ZIP文件,网上很多源码不好用,所以就自己做了一个。原始代码是VC++的用VS2019编译了一个,DLL封装了下。调用很简单 '调用方法如下: 'CreateZipFileA "C:\123", "C:\123.zip...

    C语言实现Zip压缩解压.rar

    本文将深入探讨如何使用C语言实现ZIP压缩与解压功能。 ZIP是一种广泛使用的文件压缩格式,它能够将多个文件打包并压缩成一个单一的ZIP档案,以便于存储、传输和分享。ZIP文件格式的标准由PKWARE公司制定,并由Info-...

    Zip压缩和解压文件

    本文将深入探讨Zip压缩和解压的相关知识点,并提供一个参考示例。 首先,我们要理解Zip压缩的工作原理。Zip采用了多种压缩算法,如DEFLATE,这是一种基于LZ77的无损数据压缩算法,通过查找和替换重复的数据模式来...

    C++ zip、zip压缩文件处理等压缩文件处理类源码

    5从压缩文件解压文件 6释放(关闭)压缩文件 源码包含了封装的功能模块类以及测试类, 全部源码都可以用VS2020编译通过,请放心使用! 友情提示,为了兼顾一些旧代码,预编译头文件用的是StdAfx.h,如果需要更换为...

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

    Java操作Zip文件主要涉及到对文件和目录的压缩与解压缩,以及在必要时对压缩文件进行加密处理。这里我们重点讨论使用两个库:`zip4j`和`Apache Ant`来实现这些功能。 1. **zip4j库**:`zip4j-1.3.2.jar`是一个用...

    vbs压缩和解压zip,vbs压缩zip,vbs解压zip

    ### VBS 脚本实现 ZIP 文件的压缩与解压缩 在日常工作中,我们经常会遇到需要对文件进行压缩或解压缩的情况。对于批量处理任务,使用脚本语言可以大大提高效率。Visual Basic Script(VBS)作为Windows环境中的一种...

    在线解压、压缩ZIP文件程序 V1.0

    本程序能把站点中的 ZIP 压缩文件解压到指定目录。 转载请注明:本程序由 纯粹空间(http://www.softpure.com) 提供,作者:faisun(faisun@sina.com). 使用方法:把zip文件通过FTP上传到本文件相同的目录下,选择zip...

    java解压zip压缩文件

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

    pb zip压缩和解压,以流方式读取和写入

    该对象是使用pb对文件进行zip压缩和解压,并且将zip压缩包以流方式读取和将zip压缩包的流写入到本地文件夹的方法的封装

    QT5 zip压缩和解压源代码

    解压缩文件的代码示例: ```cpp QZipReader reader("archive.zip"); for (auto entry : reader.entryList()) { QFile file(entry.fileName()); if (file.open(QFile::ReadOnly)) { // 读取文件内容 auto ...

    java压缩文件生成带密码的zip包,解压带密码的zip包的工具类

    * 使用给定密码解压指定的ZIP压缩文件到指定目录 * * 如果指定目录不存在,可以自动创建,不合法的路径将导致异常被抛出 * @param zipFile 指定的ZIP压缩文件 * @param dest 解压目录 * @param passwd ZIP文件...

    Zip文件压缩和解压

    Zip格式是一种高效的数据存储格式,它能够将多个文件和文件夹打包成一个单一的压缩文件,从而节省磁盘空间,便于传输和备份。本篇文章将深入探讨Zip文件的压缩原理、常用的工具以及源码实现。 ### 一、Zip文件格式 ...

    zip压缩及解压多文件

    zip压缩预解压多文件,提供两种方法:一,用java自带方式java.util.zip;二,应用apache的jar包,org.apache.commons.compress.archivers.zip

    java 文件zip 压缩与解压

    java 文件zip 压缩与解压 可以直接调用

    c#zip压缩与解压

    可以使用`ExtractToDirectory`方法将ZIP文件解压到指定的目录: ```csharp ZipFile.ExtractToDirectory("源.zip", "目标目录"); ``` 3. **添加文件到ZIP**: `AddEntry`方法允许你将单个文件添加到已存在的ZIP...

Global site tag (gtag.js) - Google Analytics