`

java 操作 zip

    博客分类:
  • Jave
阅读更多
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class ZipTest {
	static final int BUFFER = 2048;

	public static void main(String argv[]) throws Exception{
		read();
	}

	static void write() {
		try {
			BufferedInputStream origin = null;
			FileOutputStream dest = new FileOutputStream("f:\\mm\\m.zip");
			ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
					dest));
			byte data[] = new byte[BUFFER];
			File f = new File("f:\\mm");
			File files[] = f.listFiles();
			for (int i = 0; i < files.length; i++) {
				FileInputStream fi = new FileInputStream(files[i]);
				origin = new BufferedInputStream(fi, BUFFER);
				ZipEntry entry = new ZipEntry(files[i].getName());

				out.putNextEntry(entry);
				int count;
				while ((count = origin.read(data, 0, BUFFER)) != -1) {
					out.write(data, 0, count);
				}
				origin.close();
			}
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@SuppressWarnings("unchecked")
	static void read() {
		try {
			String fileName = "f:/mm/mm.zip";
			String filePath = "f:/mm/";
			ZipFile zipFile = new ZipFile(fileName);

			Enumeration emu = zipFile.entries();
			while (emu.hasMoreElements()) {
				ZipEntry entry = (ZipEntry) emu.nextElement();
				// 会把目录作为一个file读出一次,所以只建立目录就可以,之下的文件还会被迭代到。
				if (entry.isDirectory()) {
					new File(filePath + entry.getName()).mkdirs();
					continue;
				}
				BufferedInputStream bis = new BufferedInputStream(zipFile
						.getInputStream(entry));
				File file = new File(filePath + entry.getName());
				// 加入这个的原因是zipfile读取文件是随机读取的,这就造成可能先读取一个文件
				// 而这个文件所在的目录还没有出现过,所以要建出目录来。
				File parent = file.getParentFile();
				if (parent != null && (!parent.exists())) {
					parent.mkdirs();
				}
				FileOutputStream fos = new FileOutputStream(file);
				BufferedOutputStream bos = new BufferedOutputStream(fos, BUFFER);
				int count;
				byte data[] = new byte[BUFFER];
				while ((count = bis.read(data, 0, BUFFER)) != -1) {
					bos.write(data, 0, count);
				}
				bos.flush();
				bos.close();
				bis.close();
			}
			zipFile.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}





//
 
 

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.util.Enumeration;

import cn.llg.zip.ZipEntry;
import cn.llg.zip.ZipFile;
import cn.llg.zip.ZipOutputStream;


public class YsZipUtil {

	static final int BUFFER = 2048;

	/**
	 * 压缩文件/文件夹
	 * @param zipFileFullName 压缩后的ZIP文件的全路径名称
	 * @param inputFileFullName 需要压缩的文件/文件夹 全路径名称
	 * @throws Exception
	 */
	public static void zip(String zipFileFullName, String inputFileFullName) throws Exception {
		File zip = new File(zipFileFullName);
		File parentDir = zip.getParentFile();
		char pathSeparator = File.pathSeparatorChar;
		zip(zip, parentDir, new File[]{new File(inputFileFullName)}, pathSeparator);
	}
	
    /**
     * Recursively zips a set of root entries into a zipfile, compressing the
     * contents.
     *
     * @param zipFile target zip file.
     * @param parentDir a directory containing source files to zip.
     * @param sources an array of files and/or directories to zip.
     * @param pathSeparator path separator for zip entries.
     * 
     * @throws IOException
     */
   public static void zip( File zipFile, File parentDir, File[] sources, char pathSeparator) throws IOException {
           
       String stripPath = (parentDir != null) ? parentDir.getPath() : "";
       if (stripPath.length() > 0 && !stripPath.endsWith(File.separator)) {
           stripPath += File.separator;
       }

       ZipOutputStream out =
           new ZipOutputStream(new FileOutputStream(zipFile));
       out.setMethod(ZipOutputStream.DEFLATED);

       try {
           // something like an Ant directory scanner wouldn't hurt here
           for (int i = 0; i < sources.length; i++) {
               if (!sources[i].exists()) {
                   throw new IllegalArgumentException(
                       "File or directory does not exist: " + sources[i]);
               }

               if (sources[i].isDirectory()) {
                   zipDirectory(out, stripPath, sources[i], pathSeparator);
               } else {
                   zipFile(out, stripPath, sources[i], pathSeparator);
               }
           }
       } finally {
           out.close();
       }
   }

   /**
    * Uses code fragments from Jakarta-Ant, Copyright: Apache Software
    * Foundation.
    */
   private static void zipDirectory(ZipOutputStream out, String stripPath, File dir, char pathSeparator) throws IOException {

       String[] entries = dir.list();

       if (entries == null || entries.length == 0) {
           return;
       }

       // recurse via entries
       for (int i = 0; i < entries.length; i++) {
           File file = new File(dir, entries[i]);
           if (file.isDirectory()) {
               zipDirectory(out, stripPath, file, pathSeparator);
           } else {
               zipFile(out, stripPath, file, pathSeparator);
           }
       }
   }

   /**
    * Uses code fragments from Jakarta-Ant, Copyright: Apache Software
    * Foundation.
    */
   private static void zipFile( ZipOutputStream out, String stripPath, File file, char pathSeparator) throws IOException {
       ZipEntry ze =
           new ZipEntry(processPath(file.getPath(), stripPath, pathSeparator));
       ze.setTime(file.lastModified());
       out.putNextEntry(ze);

       byte[] buffer = new byte[2 * BUFFER];
       BufferedInputStream in =
           new BufferedInputStream(new FileInputStream(file), buffer.length);

       try {
           int count = 0;
           while ((count = in.read(buffer, 0, buffer.length)) >= 0) {
               if (count != 0) {
                   out.write(buffer, 0, count);
               }
           }
       } finally {
           in.close();
       }
   }

   private static String processPath( String path, String stripPath, char pathSeparator) {
       if (!path.startsWith(stripPath)) {
           throw new IllegalArgumentException(
               "Invalid entry: "
                   + path
                   + "; expected to start with "
                   + stripPath);
       }

       return path.substring(stripPath.length()).replace(
           File.separatorChar,
           pathSeparator);
   }

	/**
	 * 解压缩文件
	 * @param zipFileName 压缩文件,全路径
	 * @param outputDirectory 解压缩到哪个目录
	 */
	public static void unzip(String zipFileName, String outputDirectory) {

		try {

			BufferedOutputStream dest = null;

			BufferedInputStream is = null;

			ZipEntry entry;

			java.io.File f = new java.io.File(outputDirectory);
			if (f.exists() == false) {
				f.mkdirs();// 建立解压缩的目录
			}

			ZipFile zipfile = new ZipFile(zipFileName);

			Enumeration<?> e = zipfile.getEntries();

			while (e.hasMoreElements()) {

				entry = (ZipEntry) e.nextElement();

				System.out.println("Extracting: " + entry.getName());

				if (entry.isDirectory()) {
					File theDir = new File(outputDirectory + File.separator
							+ entry.getName());
					if (theDir.exists() == false) {
						theDir.mkdirs();
					}

				} else {

					File theFile = new File(outputDirectory + File.separator
							+ entry.getName());
					if (theFile.getParentFile().exists() == false) {
						theFile.getParentFile().mkdirs();
					}

					is = new BufferedInputStream

					(zipfile.getInputStream(entry));

					int count;

					byte data[] = new byte[BUFFER];

					FileOutputStream fos = new

					FileOutputStream(outputDirectory + File.separator
							+ entry.getName());

					dest = new

					BufferedOutputStream(fos, BUFFER);

					while ((count = is.read(data, 0, BUFFER)) != -1) {

						dest.write(data, 0, count);

					}

					dest.flush();

					dest.close();

					is.close();

				}
			}

		} catch (Exception e) {

			e.printStackTrace();

		}

	}
	
	public static void main(String s[]){
		try {
                           //压缩
//			YsZipUtil.zip("e:\\model.zip", "e:\\复件java编写规范.doc");
                           //解压
			YsZipUtil.unzip("f:/mm/mm.zip", "f:/mm/");
		} catch (Exception e) {
			e.printStackTrace();
			System.out.print("zip failed!");
		}
	}
}


分享到:
评论

相关推荐

    zip4j--Java操作zip压缩文件接口

    Java操作zip压缩格式的开源项目,功能强大而且使用方便,能完全满足Java操作Zip压缩文件,官方网址为:http://www.lingala.net/zip4j/ 可以下载到jar包、源码和示例,好像没有提供API文档。 不过需要使用代理访问...

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

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

    java操作zip_包括加解密码

    Java操作ZIP文件,特别是涉及到加解密码的环节,是一项常见的任务。在Java中,我们可以使用标准的`java.util.zip`库来处理基本的ZIP文件操作,但若涉及到加密和解密,就需要借助第三方库,例如`Zip4j`。本文将深入...

    zip4j_1.3.2 - Java操作zip压缩文件接口最新版本

    Java操作zip压缩格式的开源项目,功能强大而且使用方便,能完全满足Java操作Zip压缩文件,官方网址为:http://www.lingala.net/zip4j/ 可以下载到jar包、源码和示例,好像没有提供API文档。 不过需要使用代理访问...

    Java操作ZIP文件,支持密码和中文

    winszipaes是Java语言下的ZIP文件操作接口,支持密码,但源代码不支持中文,该jar包对源码作了一点修改,使其支持中文,修改信息可以参照我的博客http://blog.csdn.net/zhangyihui1986/article/details/7724229或者...

    java zip操作

    java 操作 zip压缩,解压缩 java 操作 zip压缩,解压缩 java 操作 zip压缩,解压缩 java 操作 zip压缩,解压缩 java 操作 zip压缩,解压缩

    java读取zip文件

    在Java编程环境中,读取ZIP文件是一项...通过熟练掌握`java.util.zip`包中的类,你可以轻松应对各种ZIP文件操作。在学习和参考项目示例源代码时,确保理解每一步的作用,这将有助于你在实际工作中更好地应用这些知识。

    基于Java向zip压缩包追加文件

    通过上述步骤,可以实现基于Java向ZIP压缩包追加文件的功能,虽然这个过程涉及解压和再压缩,但它是最常见的解决方案,因为Java的标准库不直接支持追加操作。在实际应用中,可以根据具体需求进行优化和调整,以满足...

    zipJava.zip

    在IT行业中,尤其是在软件开发领域,打包文件成压缩格式如ZIP是常见的操作。Java作为一种广泛使用的编程语言,提供了丰富的API来处理这样的任务。本篇将深入讲解如何使用Java实现将文件打包成ZIP的过程,主要围绕...

    java解压zip压缩文件

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

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

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

    java 打zip包

    在Java编程语言中,创建ZIP压缩包是一项常见的任务,特别是在软件开发中,如构建Web应用程序。本资源提供了一种解决方案,解决了使用Java打zip包时可能会遇到的中文乱码和包含空文件的问题。以下是关于这个主题的...

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

    在Java中,`java.util.zip`包提供了对ZIP文件的基本操作,但默认使用的是平台默认的字符集,这可能在跨平台操作时引发乱码问题。 为了解决这个中文乱码问题,我们需要在创建ZipEntry时指定合适的字符集,通常是UTF-...

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

    这种方法减少了磁盘空间的占用,提高了处理效率,特别适用于处理大文件或需要高效操作ZIP文件的场景。在实际开发中,根据具体需求,可以进一步优化这个代码,比如添加错误处理机制,或者支持替换多个文件。

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

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

    find_java.zip

    标题中的"find_java.zip"表明这是一个与Java编程语言和寻找Java环境有关的压缩文件。描述中的重复信息"find_java.zip"可能是指该压缩包的主要功能是查找或验证系统中的Java安装位置。标签"find_java"进一步确认了这...

    Java实现Zip压缩文件操作的工具类.zip

    Java实现Zip压缩文件操作的工具类 文章介绍:https://blog.csdn.net/rongbo91/article/details/117747042 (可作为Jar依赖包直接使用) 1、项目使用前,请进入rdc-bom目录下,执行mvn clean install命令  2、可...

Global site tag (gtag.js) - Google Analytics