`
hanqunfeng
  • 浏览: 1538309 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA压缩与解压缩--zip

    博客分类:
  • JAVA
阅读更多

通过java打zip包或者解压zip包,没什么特别的,jdk已经提供了API。

 

一。批量文件打压缩与解压缩,打好的zip包可以使用winrar进行解压

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;

import com.netqin.servlet.CommonServlet;

//import org.apache.tools.zip.ZipEntry; 
//import org.apache.tools.zip.ZipOutputStream; 
/** 注释乱码。 经过反复测试,发现中文支持有问题。 
 * google了一下解决方案,用ant包中的两个类 //import org.apache.tools.zip.ZipEntry; //import org.apache.tools.zip.ZipOutputStream;
 *  替换Java包的对应的两个类 import java.util.zip.ZipFile; import java.util.zip.ZipOutputStream; 即可完美支持中文。
 */

/** * Java版的Zip工具 * */
public class ZipTool {
	private static final int BUFF_SIZE = 1024 * 1024; // 1M Byte

	/**
	 * * 批量压缩文件(夹) * 
	 * * @param resFileList 要压缩的文件(夹)列表 
	 * * @param zipFile 生成的压缩文件 
	 * * @throws
	 * IOException 当压缩过程出错时抛出
	 */
	public static void zipFiles(List<File> resFileList, File zipFile)
			throws IOException {
		ZipOutputStream zipout = new ZipOutputStream(new BufferedOutputStream(
				new FileOutputStream(zipFile), BUFF_SIZE));
		for (File resFile : resFileList) {
			zipFile(resFile, zipout, "");
		}
		zipout.close();
	}

	/**
	 * * 批量压缩文件(夹) * 
	 * * @param resFileList 要压缩的文件(夹)列表 
	 * * @param zipFile 生成的压缩文件 
	 * * @param comment 压缩文件的注释 
	 * * @throws IOException 当压缩过程出错时抛出
	 */
	public static void zipFiles(List<File> resFileList, File zipFile,
			String comment) throws IOException {
		ZipOutputStream zipout = new ZipOutputStream(new BufferedOutputStream(
				new FileOutputStream(zipFile), BUFF_SIZE));
		for (File resFile : resFileList) {
			zipFile(resFile, zipout, "");
		}
		zipout.setComment(comment);
		zipout.close();
	}
	
	/**                                                          
	* 描述 : <将文件写入压缩包中>. <br>
	*<p>                                                 
	                                                                                                                                                                                                      
	* @param resFile
	* @param zipout
	* @param rootpath
	* @throws IOException                                                                                    			   
	*/
	private static void zipFile(File resFile, ZipOutputStream zipout,
			String rootpath) throws IOException {
		rootpath = rootpath
				+ (rootpath.trim().length() == 0 ? "" : File.separator)
				+ resFile.getName();
		if (resFile.isDirectory()) {
			File[] fileList = resFile.listFiles();
			for (File file : fileList) {
				zipFile(file, zipout, rootpath);
			}
		} else {
			byte buffer[] = new byte[BUFF_SIZE];
			BufferedInputStream in = new BufferedInputStream(
					new FileInputStream(resFile), BUFF_SIZE);
			zipout.putNextEntry(new ZipEntry(rootpath));
			int realLength;
			while ((realLength = in.read(buffer)) != -1) {
				zipout.write(buffer, 0, realLength);
			}
			in.close();
			zipout.flush();
			zipout.closeEntry();
		}
	}

	/**
	 * * 解压缩一个文件 * 
	 * * @param zipFile 压缩文件 
	 * * @param folderPath 解压缩的目标目录 
	 * * @throws
	 * IOException 当压缩过程出错时抛出
	 */
	@SuppressWarnings("unchecked")
	public static void upZipFile(File zipFile, String folderPath)
			throws IOException {
		ZipFile zf = new ZipFile(zipFile);
		for (Enumeration entries = zf.entries(); entries.hasMoreElements();) {
			ZipEntry entry = ((ZipEntry) entries.nextElement());
			InputStream in = zf.getInputStream(entry);
			OutputStream out = new FileOutputStream(folderPath + File.separator
					+ entry.getName());
			byte buffer[] = new byte[BUFF_SIZE];
			int realLength;
			while ((realLength = in.read(buffer)) > 0) {
				out.write(buffer, 0, realLength);
			}
			in.close();
			out.close();
		}
	}

	

	
	public static void main(String[] args) throws IOException {
		List resFileList = new ArrayList();
		resFileList.add(new File("C:\\new.gif"));
		resFileList.add(new File("C:\\HelloWorld.java"));
		resFileList.add(new File("C:\\crebas.sql"));
		resFileList.add(new File("E:\\log.log"));
		resFileList.add(new File("C:\\ooo\\upx\\"));
		File zipFile = new File("C:\\txxxt.zip");
		ZipUtils.zipFiles(resFileList, zipFile);
	}

}

 二.流压缩及解压缩

	/**                                                          
	* 描述 : <将流打包到文件>. <br>
	*<p>                                                 
	                                                                                                                                                                                                      
	* @param b 数据流
	* @param filename 压缩包文件路径
	* @return
	* @throws IOException                                                                                    			   
	*/
	public static String makeZipFile(byte[] b, String filename)
			throws IOException {
		File file = new File(filename+".zip");
		ZipOutputStream zipout = new ZipOutputStream(new BufferedOutputStream(
				new FileOutputStream(file), BUFF_SIZE));
		zipout.putNextEntry(new ZipEntry(filename));
		zipout.write(b);

		zipout.flush();
		zipout.closeEntry();
		zipout.setComment("");
		zipout.close();

		return fileNewName;
	}

	

	/**                                                          
	* 描述 : <获得文件的数据流>. <br>
	*<p>                                                 
	                                                                                                                                                                                                      
	* @param filename 文件路径
	* @return
	* @throws FileNotFoundException                                                                                    			   
	*/
	public static byte[] getZipFileByte(String filename)
			throws FileNotFoundException {
		File file = new File(filename);
		byte buffer[] = new byte[BUFF_SIZE];
		InputStream stream = null;
		byte[] data = null;

		try {
			if (file.canRead()) {

				stream = new FileInputStream(file);
				data = new byte[Integer.parseInt(String.valueOf(file.length()))];
				stream.read(data);
			} else {
				return null;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;

		} finally {
			if (stream != null) {
				try {
					stream.close();
				} catch (IOException e) {
					e.printStackTrace();

				}
			}
		}

		return data;
	}

	

	/**
	 * 描述 : <对数据流进行压缩,并返回压缩后的数据流>. <br>
	 *<p>
	 * 
	 * @param b
	 * @return
	 */
	public byte[] getZipByte(byte[] b) {

		byte[] compressed = null;
		ByteArrayOutputStream out = null;
		ZipOutputStream zout = null;

		try {
			out = new ByteArrayOutputStream();
			zout = new ZipOutputStream(out);
			zout.putNextEntry(new ZipEntry("0"));
			zout.write(b);
			zout.closeEntry();
			compressed = out.toByteArray();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			if (zout != null) {
				try {

					zout.close();
				} catch (IOException e) {
				}
			}
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
				}
			}
		}
		return compressed;
	}

	/**
	 * 将压缩后的 byte[] 数据解压缩
	 * 
	 * @param compressed
	 *            压缩后的 byte[] 数据
	 * @return 解压后的字符串
	 * @throws ClassNotFoundException
	 */
	public static final byte[] decompress(byte[] compressed) {

		if (compressed == null)
			return null;

		ByteArrayOutputStream out = null;
		ByteArrayInputStream in = null;
		ZipInputStream zin = null;
		byte[] decompressed = null;
		try {
			out = new ByteArrayOutputStream();
			in = new ByteArrayInputStream(compressed);
			zin = new ZipInputStream(in);

			ZipEntry entry = zin.getNextEntry();

			byte[] buffer = new byte[1024];
			int offset = -1;
			while ((offset = zin.read(buffer)) != -1) {
				out.write(buffer, 0, offset);
			}

			decompressed = out.toByteArray();
		} catch (Exception e) {
			e.printStackTrace();
			decompressed = null;
		} finally {
			if (zin != null) {
				try {
					zin.close();
				} catch (IOException e) {
				}
			}
			if (in != null) {
				try {
					in.close();
				} catch (IOException e) {
				}
			}
			if (out != null) {
				try {
					out.close();
				} catch (IOException e) {
				}
			}
		}

		return decompressed;
	}

 说明一下,在对流进行压缩时,如果最后没有将流写入到文件里,而是将流直接吐出,这样生成的文件将不能通过winrar进行解压,只能通过java读流的方式解压。

分享到:
评论
1 楼 浪子柔情 2011-07-12  


  lz您好 ,你上线后 麻烦你加下我的QQ358846415

  就您上面写的批量压缩文件  我有个问题想要请教您   很急  谢谢 @!

等你回信

相关推荐

    绿色版命令行压缩解压缩工具-----7Zip压缩工具

    7-Zip是一款强大的开源压缩工具,特别适合在命令行环境下使用,尤其对于需要通过Java程序进行文件压缩或解压缩操作的场景。它以其高效的压缩比和丰富的格式支持而备受青睐。7-Zip不仅提供图形用户界面,还支持命令行...

    JAVA文件压缩与解压缩实践(源代码).zip

    JAVA文件压缩与解压缩实践(源代码).zipJAVA文件压缩与解压缩实践(源代码).zipJAVA文件压缩与解压缩实践(源代码).zipJAVA文件压缩与解压缩实践(源代码).zipJAVA文件压缩与解压缩实践(源代码).zipJAVA文件压缩与解压缩...

    JAVA文件压缩与解压缩实践(源代码+论文)

    在Java编程语言中,文件的压缩与解压缩是常见的数据处理操作,特别是在数据传输、存储优化和备份场景中。本实践项目围绕这个主题展开,包括源代码和相关的论文,为学习者提供了深入理解和应用Java压缩库的机会。以下...

    java毕业设计——java文件压缩与解压缩实践设计与开发(源代码+论文).zip

    java毕业设计——java文件压缩与解压缩实践设计与开发(源代码+论文).zip java毕业设计——java文件压缩与解压缩实践设计与开发(源代码+论文).zip java毕业设计——java文件压缩与解压缩实践设计与开发(源代码+论文)....

    JAVA文件压缩与解压缩实践,java解压缩zip文件,Java源码.zip

    在Java编程语言中,文件的压缩与解压缩是常见的操作,尤其在数据传输、存储优化以及备份场景下显得尤为重要。...通过上述知识点,开发者能够有效地在Java环境中进行ZIP文件的压缩与解压缩操作,满足实际项目需求。

    Java工具类ZIP解压缩

    Java工具类ZIP解压缩Java工具类ZIP解压缩Java工具类ZIP解压缩

    java zip文件压缩与解压缩

    解压缩ZIP文件则可以使用`org.apache.commons.compress.archivers.zip.ZipArchiveInputStream`类。同样,我们需要设置正确的编码来正确读取中文文件名: ```java import org.apache.commons.compress.archivers.zip...

    java ZIP 解压缩

    java语言操作解压缩文件。 /** * 数据压缩 * * @param data * @return * @throws Exception */ public static byte[] compress(byte[] data) throws Exception { ByteArrayInputStream bais = new ...

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

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

    JAVA文件压缩与解压缩实践(源代码+LW).zip

    JAVA文件压缩与解压缩实践(源代码+LW)JAVA文件压缩与解压缩实践(源代码+LW)JAVA文件压缩与解压缩实践(源代码+LW)JAVA文件压缩与解压缩实践(源代码+LW)JAVA文件压缩与解压缩实践(源代码+LW)JAVA文件压缩与解压缩实践...

    JAVA文件压缩与解压缩实践(源代码+论文).zip

    JAVA文件压缩与解压缩实践(源代码+论文)JAVA文件压缩与解压缩实践(源代码+论文)JAVA文件压缩与解压缩实践(源代码+论文)JAVA文件压缩与解压缩实践(源代码+论文)JAVA文件压缩与解压缩实践(源代码+论文)JAVA文件压缩与...

    java解压缩zip代码与用到的jar包

    以下是一个基本的Java代码示例,演示如何解压缩ZIP文件: ```java import java.io.*; import java.util.zip.*; public class UnzipExample { public static void unzip(String zipFilePath, String destDirectory...

    java 解压缩zip文件

    在Java编程语言中,解压缩ZIP文件是一项常见的任务,特别是在处理数据传输、文件打包和部署等场景下。本文将深入探讨如何使用Java API来解压缩ZIP文件,包括基本概念、核心类库以及具体实现步骤。 ZIP文件是一种...

    Java 项目-java的JAVA文件压缩与解压缩实践.zip

    在Java编程语言中,文件的压缩与解压缩是常见的操作,尤其在项目开发过程中,为了节省存储空间或方便传输,我们常需要对文件进行压缩。本项目“Java 项目-java的JAVA文件压缩与解压缩实践.zip”提供了一个实战示例,...

    java zip 压缩 解压缩 附带ant.jar

    解压缩ZIP文件的过程则使用`ZipInputStream`: ```java import java.io.*; import java.util.zip.*; public class JavaUnzip { public static void main(String[] args) { try { File destinationDirectory = ...

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

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

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

    首先,我们需要了解Java中的`java.util.zip`包,这个包提供了处理压缩文件的基本工具。在ZIP格式的压缩包处理中,我们主要会用到`ZipInputStream`和`ZipEntry`这两个类。`ZipInputStream`是用于读取ZIP文件的输入流...

    Java压缩/解压缩zip

    使用Java核心API实现单文件/多文件/整个目录的压缩/解压缩功能,由于自带API(1.6)不支持指定编码方式,因此中文会出现乱码(1.7貌似已经支持指定编码方式),所以还写了一个基于ant包的压缩/解压缩代码。

Global site tag (gtag.js) - Google Analytics