`

java 压缩解压 zip

 
阅读更多
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

    Java压缩解压ZIP之Zip4j

    这篇博客文章“Java压缩解压ZIP之Zip4j”可能详细介绍了如何使用Zip4j进行文件的压缩和解压缩操作。 首先,我们需要了解Zip4j库的核心概念。Zip4j提供了一个名为`ZipFile`的类,它代表一个ZIP文件,包含了所有与ZIP...

    用Java压缩解压ZIP文件

    用Java压缩解压ZIP文件,将利用java.util.zip 包中提供的类来实现压缩和解压zip 格式文件的功能。当然,本例在功能上完全没有Winzip 等成熟的压缩软件那么强,也不能做的很强,本例仅仅是演示如何来使用java.util....

    java将文件夹压缩成zip,解压zip压缩包

    解压ZIP文件的过程相对简单,主要使用`ZipInputStream`和`FileOutputStream`。以下是解压的基本步骤: 1. **创建`ZipInputStream`**:使用`FileInputStream`打开ZIP文件,然后传递给`ZipInputStream`。 2. **读取`...

    java解压zip压缩文件

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

    Java实现的带密码压缩与解压zip文件源码

    `ZipOutputStream`用于创建ZIP文件,而`ZipInputStream`则用于读取和解压ZIP文件。为了添加密码保护,我们需要在创建`ZipOutputStream`时设置一个密码。 1. **密码保护**:在压缩过程中,可以使用`ZipEntry`对象来...

    JAVA解压ZIP格式的压缩包_java解压缩_zip_

    本文将深入探讨如何使用Java来解压ZIP格式的压缩包,并提供相关的源码参考。 首先,我们需要了解Java中的`java.util.zip`包,这个包提供了处理压缩文件的基本工具。在ZIP格式的压缩包处理中,我们主要会用到`...

    JAVA解压ZIP多层目录文件(需ant.jar

    ### JAVA解压ZIP多层目录文件(需ant.jar) #### 概述 本文将详细介绍一个Java方法,该方法用于解压包含多层目录结构的ZIP文件,并能够支持中文文件名。这种方法利用了Apache Ant库中的`org.apache.tools.zip....

    Java实现Zip的压缩和解压

    NULL 博文链接:https://zhenyong.iteye.com/blog/1576148

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

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

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

    本文将深入探讨如何使用Java实现ZIP和RAR类型的压缩与解压操作,以及相关知识点。 首先,我们来看ZIP文件格式。ZIP是一种广泛使用的文件压缩格式,其在Java中的处理主要通过`java.util.zip`包。这个包提供了多个类...

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

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

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

    在Java编程中,处理文件压缩和解压是常见的任务,特别是使用ZIP格式。然而,当涉及到包含中文字符的文件或目录时,可能会遇到乱码问题。这个问题主要源于字符编码的不一致,通常需要正确设置字符集来确保中文字符在...

    Java压缩解压zip技术_动力节点Java学院整理

    `ZipOutputStream`用于创建ZIP文件,而`ZipInputStream`则用于读取和解压ZIP文件。这两个类都继承自`FilterOutputStream`和`FilterInputStream`,它们分别提供了压缩和解压缩的基本功能。 在Java中压缩文件,主要...

    JAVA解压缩ZIP或RAR格式的文件

    在Java编程环境中,解压缩ZIP或RAR格式的文件是一项常见的任务,这主要涉及到I/O流、文件操作以及压缩和解压缩库的使用。本篇将深入讲解如何在Java中实现这个功能,同时会介绍一些相关的工具和源码。 首先,对于ZIP...

    Java压缩和解压缩zip文件

    `ZipOutputStream` 用于创建ZIP文件,而 `ZipInputStream` 则用于读取和解压ZIP文件。以下是一个简单的压缩示例: ```java import java.io.*; import java.util.zip.*; public class ZipUtil { public static ...

    使用 Java 实现的压缩/解压 ZIP 文件的工具类

    以上代码示例展示了如何使用Java的`java.util.zip`包创建和解压ZIP文件。这些工具类可以作为通用的ZIP操作函数库,适用于各种项目需求。注意,实际应用中可能需要添加错误处理和日志记录以增强健壮性。同时,对于大...

    java Zip压缩解压

    总结来说,"java Zip压缩解压"涉及了Java标准库中的`java.util.zip`包,用于创建和读取ZIP文件;Apache Ant作为构建工具,可能用于自动化压缩和解压过程;而JUnit则用于编写和运行测试,确保代码的正确实现。在实际...

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

    ### 使用 Java.util.zip 包实现数据压缩与解压 在计算机科学领域,数据压缩技术是一项重要的功能,它能够帮助减少存储空间的需求以及提高网络传输效率。本文将通过一系列的示例来详细介绍如何利用 Java 中的 `java....

Global site tag (gtag.js) - Google Analytics