package com.test.zipFile; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; import org.junit.Test; /** * 通过Java的Zip输入输出流实现压缩和解压文件 * */ public class ZipUtil { public ZipUtil() { // empty } /** * 压缩文件 * * @param filePath * 待压缩的文件路径 * @return 压缩后的文件 * @throws Exception */ public static File zip(String filePath) throws Exception { File target = null; File source = new File(filePath); if (source.exists()) { // 压缩文件名=源文件名.zip String zipName = source.getName() + ".zip"; target = new File(source.getParent(), zipName); if (target.exists()) { target.delete(); // 删除旧的文件 } FileOutputStream fos = null; ZipOutputStream zos = null; try { fos = new FileOutputStream(target); zos = new ZipOutputStream(new BufferedOutputStream(fos)); // 添加对应的文件Entry addEntry("", source, zos); } catch (IOException e) { throw new RuntimeException(e); } finally { if (null != zos) { zos.close(); } if (null != fos) { fos.close(); } } } return target; } /** * 扫描添加文件Entry * * @param base * 基路径 * * @param source * 源文件 * @param zos * Zip文件输出流 * @throws IOException */ @SuppressWarnings("resource") private static void addEntry(String base, File source, ZipOutputStream zos) throws Exception { // 按目录分级,形如:aaa/bbb.txt String entry = base + source.getName(); if (source.isDirectory()) { for (File file : source.listFiles()) { // 递归列出目录下的所有文件,添加文件Entry addEntry(entry + "/", file, zos); } } else { FileInputStream fis = null; BufferedInputStream bis = null; byte[] buffer = new byte[1024 * 10]; fis = new FileInputStream(source); bis = new BufferedInputStream(fis, buffer.length); int read = 0; zos.putNextEntry(new ZipEntry(entry)); while ((read = bis.read(buffer, 0, buffer.length)) != -1) { zos.write(buffer, 0, read); } zos.closeEntry(); } } /** * 解压文件 * * @param filePath * 压缩文件路径 * @throws Exception */ public static void unzip(String filePath) throws Exception { File source = new File(filePath); if (source.exists()) { ZipInputStream zis = null; BufferedOutputStream bos = null; zis = new ZipInputStream(new FileInputStream(source)); ZipEntry entry = null; while ((entry = zis.getNextEntry()) != null && !entry.isDirectory()) { File target = new File(source.getParent(), entry.getName()); if (!target.getParentFile().exists()) { // 创建文件父目录 target.getParentFile().mkdirs(); } // 写入文件 bos = new BufferedOutputStream(new FileOutputStream(target)); int read = 0; byte[] buffer = new byte[1024 * 10]; while ((read = zis.read(buffer, 0, buffer.length)) != -1) { bos.write(buffer, 0, read); } bos.flush(); } zis.closeEntry(); if (null != zis) { zis.close(); } if (null != bos) { bos.close(); } } } public static void main(String[] args) throws Exception { String targetPath = "D:/CSVFile"; File file = ZipUtil.zip(targetPath); System.out.println(file); } @Test public void testZipFile() throws Exception { File sourceFile = new File("D:/aaabb.docx"); InputStream inputStream = new FileInputStream(sourceFile); OutputStream out = new FileOutputStream("d:/aaabbbccc.zip"); ZipOutputStream zipOut = new ZipOutputStream(out); String entry = sourceFile.getName(); zipOut.putNextEntry(new ZipEntry(entry)); // 把要压缩的文件put Entry int b = -1; while ((b = inputStream.read()) != -1) { zipOut.write(b); } zipOut.closeEntry(); zipOut.close(); inputStream.close(); } @Test public void testUnZipFile() throws Exception{ File zipFile = new File("D:/aaabbbccc.zip"); ZipInputStream zipInput = new ZipInputStream(new FileInputStream(zipFile)); ZipEntry nextEntry = zipInput.getNextEntry(); String name = nextEntry.getName(); File outPutFile = new File("d:/uu/"); if(!outPutFile.exists()){ outPutFile.mkdirs(); } FileOutputStream out = new FileOutputStream(outPutFile.getAbsolutePath()+"/"+name); int b = -1; while ( (b = zipInput.read()) != -1 ) { out.write(b); } out.close(); zipInput.closeEntry(); zipInput.close(); } }
另一种方式
//==============================================================================
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration; import org.apache.tools.ant.Project; import org.apache.tools.ant.taskdefs.Zip; import org.apache.tools.ant.types.FileSet; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; /** * 文件解压缩工具类 * */ public class ZipFileOperateUtil { private String logPath = ""; public String getLogPath() { return this.logPath; } public void setLogPath(String logPath) { this.logPath = logPath; } /** * 压缩文件 * * @param zipFilePath 压缩的文件完整名称(目录+文件名) * @param srcPathName 需要被压缩的文件或文件夹 */ public void compressFiles(String zipFilePath, String srcPathName) { File zipFile = new File(zipFilePath); File srcdir = new File(srcPathName); if (!srcdir.exists()) { throw new RuntimeException(srcPathName + "不存在!"); } Project prj = new Project(); FileSet fileSet = new FileSet(); fileSet.setProject(prj); if (srcdir.isDirectory()) { //是目录 fileSet.setDir(srcdir); fileSet.setIncludes("*.xlsx"); //包括哪些文件或文件夹 eg:zip.setIncludes("*.java"); fileSet.setIncludes("*.xls"); fileSet.setIncludes("*.txt"); //fileSet.setExcludes(...); //排除哪些文件或文件夹 } else { fileSet.setFile(srcdir); } Zip zip = new Zip(); zip.setProject(prj); zip.setDestFile(zipFile); zip.setEncoding("utf-8"); //以gbk编码进行压缩,注意windows是默认以gbk编码进行压缩的 zip.addFileset(fileSet); zip.execute(); // logger.debug("---compress files success---"); } /** * 解压文件到指定目录 * * @param //zipFile 目标文件 * @param //descDir 解压目录 * @author isDelete 是否删除目标文件 */ public void unZipFiles(String zipFilePath, String fileSavePath, boolean isDelete) { ZipFileOperateUtil fileOperateUtil = new ZipFileOperateUtil(); boolean isUnZipSuccess = true; try { (new File(fileSavePath)).mkdirs(); File f = new File(zipFilePath); if ((!f.exists()) && (f.length() <= 0)) { throw new RuntimeException("not find " + zipFilePath + "!"); } //一定要加上编码,之前解压另外一个文件,没有加上编码导致不能解压 ZipFile zipFile = new ZipFile(f, "gbk"); String gbkPath, strtemp; Enumeration<ZipEntry> e = zipFile.getEntries(); while (e.hasMoreElements()) { org.apache.tools.zip.ZipEntry zipEnt = e.nextElement(); gbkPath = zipEnt.getName(); strtemp = fileSavePath + File.separator + gbkPath; if (zipEnt.isDirectory()) { //目录 File dir = new File(strtemp); if (!dir.exists()) { dir.mkdirs(); } continue; } else { // 读写文件 InputStream is = zipFile.getInputStream(zipEnt); BufferedInputStream bis = new BufferedInputStream(is); // 建目录 String strsubdir = gbkPath; for (int i = 0; i < strsubdir.length(); i++) { if (strsubdir.substring(i, i + 1).equalsIgnoreCase("/")) { String temp = fileSavePath + File.separator + strsubdir.substring(0, i); File subdir = new File(temp); if (!subdir.exists()) { subdir.mkdir(); } } } FileOutputStream fos = new FileOutputStream(strtemp); BufferedOutputStream bos = new BufferedOutputStream(fos); int len; byte[] buff = new byte[5120]; while ((len = bis.read(buff)) != -1) { bos.write(buff, 0, len); } bos.close(); fos.close(); } } zipFile.close(); } catch (Exception e) { // logger.error("解压文件出现异常:", e); isUnZipSuccess = false; System.out.println("extract file error: " + zipFilePath); fileOperateUtil.WriteStringToFile(fileOperateUtil.logPath, "extract file error: " + zipFilePath); } /** * 文件不能删除的原因: * 1.看看是否被别的进程引用,手工删除试试(删除不了就是被别的进程占用) 2.file是文件夹 并且不为空,有别的文件夹或文件, 3.极有可能有可能自己前面没有关闭此文件的流(我遇到的情况) */ if (isDelete && isUnZipSuccess) { boolean flag = new File(zipFilePath).delete(); // logger.debug("删除源文件结果: " + flag); fileOperateUtil.WriteStringToFile(fileOperateUtil.logPath, "delete " + zipFilePath + "result: " + flag); } // logger.debug("compress files success"); } /** * 删除指定文件夹下所有文件 * param path 文件夹完整绝对路径 * * @param path * @return */ public static boolean delAllFile(String path) { System.out.println(path); boolean flag = false; File file = new File(path); if (!file.exists()) { return flag; } if (!file.isDirectory()) { return flag; } String[] tempList = file.list(); File temp = null; for (int i = 0; i < tempList.length; i++) { if (path.endsWith(File.separator)) { temp = new File(path + tempList[i]); } else { temp = new File(path + File.separator + tempList[i]); } if (temp.isFile()) { temp.delete(); } if (temp.isDirectory()) { delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件 boolean success = (new File(path + "/" + tempList[i])).delete(); flag = success; } } return flag; } /** * 复制单个文件 * * @param oldPath String 原文件路径 如:c:/fqf.txt * @param newPath String 复制后路径 如:f:/fqf.txt * @return boolean */ public void copyFile(String oldPath, String newPath) { BufferedInputStream bis = null; BufferedOutputStream bos = null; try { (new File(newPath)).mkdirs(); //如果文件夹不存在 则建立新文件夹 bis = new BufferedInputStream(new FileInputStream(oldPath)); bos = new BufferedOutputStream(new FileOutputStream(newPath)); int hasRead = 0; byte b[] = new byte[2048]; while ((hasRead = bis.read(b)) > 0) { bos.write(b, 0, hasRead); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (bos != null) { try { bos.flush(); bos.close(); } catch (IOException e) { e.printStackTrace(); } } if (bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 复制整个文件夹内容 * @param oldPath String 原文件路径 如:c:/fqf * @param newPath String 复制后路径 如:f:/fqf/ff * @return boolean */ public void copyFolder(String oldPath, String newPath) { System.out.println("copy path: " + oldPath); try { (new File(newPath)).mkdirs(); //如果文件夹不存在 则建立新文件夹 File a = new File(oldPath); String[] file = a.list(); File temp = null; for (int i = 0; i < file.length; i++) { if (oldPath.endsWith(File.separator)) { temp = new File(oldPath + file[i]); } else { temp = new File(oldPath + File.separator + file[i]); } if (temp.isFile()) { FileInputStream input = new FileInputStream(temp); FileOutputStream output = new FileOutputStream(newPath + "/" + (temp.getName()).toString()); byte[] b = new byte[5120]; int len; while ((len = input.read(b)) != -1) { output.write(b, 0, len); } output.flush(); output.close(); input.close(); } if (temp.isDirectory()) {//如果是子文件夹 this.copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]); } } } catch (Exception e) { System.out.println("复制整个文件夹内容操作出错"); e.printStackTrace(); } } /** * 写内容到指定文件 * @param filePath * @param content */ public void WriteStringToFile(String filePath, String content) { try { FileWriter fw = new FileWriter(filePath, true); BufferedWriter bw = new BufferedWriter(fw); bw.write(content + "\r\n");// 往已有的文件上添加字符串 bw.close(); fw.close(); } catch (Exception e) { e.printStackTrace(); } } public void extractFiles(String strPath) { ZipFileOperateUtil fileOperateUtil = new ZipFileOperateUtil(); File dir = new File(strPath); File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组 if (files != null) { for (int i = 0; i < files.length; i++) { String fileName = files[i].getName(); if (!files[i].isDirectory() && (fileName.endsWith(".jar") || fileName.endsWith(".zip"))) { // 判断文件名是否以.jar结尾 String sourceFilePath = files[i].getAbsolutePath(); ////////fileOperateUtil.WriteStringToFile(fileOperateUtil.getLogPath(), "extract file: " + sourceFilePath); String dirName = fileName.substring(0, fileName.length() - 4); String resultPath = sourceFilePath.replace(fileName, dirName); fileOperateUtil.unZipFiles(sourceFilePath, resultPath, true); } } } } public static void main(String[] args) throws Exception { ZipFileOperateUtil fileutile = new ZipFileOperateUtil(); fileutile.compressFiles("F:\\Work\\code\\registration-platform\\registration-web\\新建文件夹\\test.zip", "F:\\Work\\code\\registration-platform\\registration-web\\新建文件夹"); System.out.println("end"); } }
相关推荐
java压缩解压ZIP
这篇博客文章“Java压缩解压ZIP之Zip4j”可能详细介绍了如何使用Zip4j进行文件的压缩和解压缩操作。 首先,我们需要了解Zip4j库的核心概念。Zip4j提供了一个名为`ZipFile`的类,它代表一个ZIP文件,包含了所有与ZIP...
用Java压缩解压ZIP文件,将利用java.util.zip 包中提供的类来实现压缩和解压zip 格式文件的功能。当然,本例在功能上完全没有Winzip 等成熟的压缩软件那么强,也不能做的很强,本例仅仅是演示如何来使用java.util....
解压ZIP文件的过程相对简单,主要使用`ZipInputStream`和`FileOutputStream`。以下是解压的基本步骤: 1. **创建`ZipInputStream`**:使用`FileInputStream`打开ZIP文件,然后传递给`ZipInputStream`。 2. **读取`...
在Java编程环境中,解压ZIP压缩文件是一项常见的任务,它涉及到文件I/O操作以及对ZIP文件格式的理解。本文将深入探讨如何使用Java实现这一功能,同时也会提及`UnZip.java`和`UnZip2.java`这两个文件可能包含的实现...
`ZipOutputStream`用于创建ZIP文件,而`ZipInputStream`则用于读取和解压ZIP文件。为了添加密码保护,我们需要在创建`ZipOutputStream`时设置一个密码。 1. **密码保护**:在压缩过程中,可以使用`ZipEntry`对象来...
本文将深入探讨如何使用Java来解压ZIP格式的压缩包,并提供相关的源码参考。 首先,我们需要了解Java中的`java.util.zip`包,这个包提供了处理压缩文件的基本工具。在ZIP格式的压缩包处理中,我们主要会用到`...
### JAVA解压ZIP多层目录文件(需ant.jar) #### 概述 本文将详细介绍一个Java方法,该方法用于解压包含多层目录结构的ZIP文件,并能够支持中文文件名。这种方法利用了Apache Ant库中的`org.apache.tools.zip....
NULL 博文链接:https://zhenyong.iteye.com/blog/1576148
Java操作Zip文件主要涉及到对文件和目录的压缩与解压缩,以及在必要时对压缩文件进行加密处理。这里我们重点讨论使用两个库:`zip4j`和`Apache Ant`来实现这些功能。 1. **zip4j库**:`zip4j-1.3.2.jar`是一个用...
本文将深入探讨如何使用Java实现ZIP和RAR类型的压缩与解压操作,以及相关知识点。 首先,我们来看ZIP文件格式。ZIP是一种广泛使用的文件压缩格式,其在Java中的处理主要通过`java.util.zip`包。这个包提供了多个类...
本文将深入探讨如何使用Java来处理ZIP文件,特别是针对标题所提及的“java 中 zip压缩文件解压工具类”。我们将讨论核心的Java API,如`java.util.zip`包中的类,并通过一个名为`CompressFileUtils`的工具类来展示...
在Java编程中,处理文件压缩和解压是常见的任务,特别是使用ZIP格式。然而,当涉及到包含中文字符的文件或目录时,可能会遇到乱码问题。这个问题主要源于字符编码的不一致,通常需要正确设置字符集来确保中文字符在...
`ZipOutputStream`用于创建ZIP文件,而`ZipInputStream`则用于读取和解压ZIP文件。这两个类都继承自`FilterOutputStream`和`FilterInputStream`,它们分别提供了压缩和解压缩的基本功能。 在Java中压缩文件,主要...
在Java编程环境中,解压缩ZIP或RAR格式的文件是一项常见的任务,这主要涉及到I/O流、文件操作以及压缩和解压缩库的使用。本篇将深入讲解如何在Java中实现这个功能,同时会介绍一些相关的工具和源码。 首先,对于ZIP...
`ZipOutputStream` 用于创建ZIP文件,而 `ZipInputStream` 则用于读取和解压ZIP文件。以下是一个简单的压缩示例: ```java import java.io.*; import java.util.zip.*; public class ZipUtil { public static ...
以上代码示例展示了如何使用Java的`java.util.zip`包创建和解压ZIP文件。这些工具类可以作为通用的ZIP操作函数库,适用于各种项目需求。注意,实际应用中可能需要添加错误处理和日志记录以增强健壮性。同时,对于大...
总结来说,"java Zip压缩解压"涉及了Java标准库中的`java.util.zip`包,用于创建和读取ZIP文件;Apache Ant作为构建工具,可能用于自动化压缩和解压过程;而JUnit则用于编写和运行测试,确保代码的正确实现。在实际...
### 使用 Java.util.zip 包实现数据压缩与解压 在计算机科学领域,数据压缩技术是一项重要的功能,它能够帮助减少存储空间的需求以及提高网络传输效率。本文将通过一系列的示例来详细介绍如何利用 Java 中的 `java....