`
qifan.yang
  • 浏览: 52770 次
社区版块
存档分类
最新评论

java多重打包解压ZIP文件

    博客分类:
  • java
阅读更多
今天用到了ZIP,涉及多重打包解压zip

在网上搜了下。组要导入额外的jar包。不符合自己的要求,就自己写了个

实现把文件重复压缩两次(压缩文件里面还是压缩文件),主要是采用一个缓冲保存第一次压缩结果。然后再来压缩一次就可以了


压缩
package net.xf;

import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

import com.sun.tools.javac.util.DefaultFileManager.Archive;

import sun.tools.tree.NewArrayExpression;

public class ZipArchive {

	private static ZipArchive instance = new ZipArchive();
	private String destPath;//压缩文件的存放位置
	private String zipName;//压缩文件名
	private ZipOutputStream zos;

	public ZipArchive() {
		this("C:\\zipArchive","test.zip");// 默认压缩到C盘下
	}

	public ZipArchive(String destPath,String zipName) {
		this.destPath = destPath;
		this.zipName=zipName;
		init(this.zipName);
	}

	//更改zipName后应该重新初始化zos
	private void init(String zipName) {
		File file = new File(destPath);
		if (!file.exists()) {
			file.mkdir();
		}
		FileOutputStream dest = null;
		try {
			dest = new FileOutputStream(destPath + "\\\\" + zipName);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}

		// 输出文件
		BufferedOutputStream buffOut = new BufferedOutputStream(dest); // buffout用于压缩缓冲
		zos = new ZipOutputStream(buffOut); // 用ZipOut包装buffOut,
	}

	public void setDestPath(String destPath) {
		this.destPath = destPath;
	}

	public String getDestPath() {
		return destPath;
	}

	public static ZipArchive getInstance() {
		return instance;
	}

	private void archive(ByteArrayInputStream inputStream, String innerFileName) {
		archive(zos, inputStream, innerFileName);
	}

	private void archive(ZipOutputStream zos, ByteArrayInputStream inputStream,
			String innerFileName) {
		try {
			zos.putNextEntry(new ZipEntry(innerFileName));
			int len;
			while ((len = inputStream.read()) != -1) {
				zos.write(len);
			}
			//zos.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

	/** 
	 * 压缩在压缩,
	 * @param inputStream 压缩的内容
	 * @param innerFileName 解压缩后文件名
	 * @param innerZipName  内层压缩的文件名
	 * @throws IOException
	 */
	private void doubleArchive(ByteArrayInputStream inputStream,
			String innerFileName, String innerZipName) throws IOException {
		// 因为是双重压缩,通过一个ByteArrayOutputStream的缓冲区实现
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(
				1024 * 1024);
		ZipOutputStream tempOut = new ZipOutputStream(byteArrayOutputStream);

		// 第一次压缩,压缩的结果放到xmlOut中
		archive(tempOut, inputStream, innerFileName);
		tempOut.flush();
		tempOut.finish();

		// 第二次压缩,压缩的结果放到最终输入的out中
		archive(zos,
				new ByteArrayInputStream(byteArrayOutputStream.toByteArray()),
				innerZipName);

	}
	
	private void closeAll() throws IOException{
		zos.flush();
		zos.close();
	}




	public static void main(String[] args) throws IOException {
		ZipArchive archive = ZipArchive.getInstance();
		archive.archive(new ByteArrayInputStream("gannisdf".getBytes()), "sss.txt");
		archive.doubleArchive(new ByteArrayInputStream("sdfsdfsdfgannisdfsdfsdfsdf".getBytes()), "sss.txt","shit.zip");
	    archive.closeAll();
	}
}


  • 1.rar (105 KB)
  • 下载次数: 21
1
1
分享到:
评论

相关推荐

    unCompress.zip

    本文将深入探讨如何使用Java语言处理`.zip`格式的压缩文件,包括解压和删除文件目录及文件的操作。 首先,`.zip`是一种广泛使用的文件压缩格式,它允许我们将多个文件或目录打包成一个单一的文件,从而节省存储空间...

    DH.tar.xz.zip

    标题 "DH.tar.xz.zip" 暗示我们正在处理一个经过多重压缩的文件,它首先被归档为 .tar 文件,然后使用 .xz 压缩,最后又用 .zip 进行了封装。这样的组合可能是因为用户希望在不同环境下都能方便地解压,因为不同的...

    javacore_notes

    - `-0`: 只存储方式,不使用ZIP压缩。 - `-M`: 不产生清单文件。 - `-i`: 为指定的jar文件产生索引信息。 - **示例**: - 将两个类文件打包到`classes.jar`中:`jar cvf classes.jar Foo.class Bar.class` - ...

    jdk-7-windows-i586.zip

    1. **下载与解压**:首先,从可靠的来源下载`jdk-7-windows-i586.zip`,然后使用解压缩工具将其解压到一个方便的位置,例如"C:\Program Files"目录下。 2. **安装JDK**:解压后的文件`jdk-7-windows-i586.exe`是一...

    jdk1.7.0_67.zip

    "jdk1.7.0_67.zip" 是一个包含Java SE(标准版)7.0更新67版本的压缩包文件,特别适合那些在公司环境中没有权限直接安装JDK的开发者。这个版本发布于2014年,旨在提供稳定性和性能优化,同时也修复了一些已知的安全...

    ext-2.2.zip.tar.gz

    标题中的"ext-2.2.zip.tar.gz"表明这是一个经过多重压缩的文件,它首先是一个zip文件,然后被tar打包,最后用gzip进行了压缩。在Linux或Unix环境中,这种组合通常用于减小文件大小以便于网络传输或存储。解压这个...

    jdk-18.0.1.1_linux-aarch64_bin.tar.gz.zip

    ".gz"是GNU Zip的压缩格式,它能有效地压缩文件,使其占用更少的磁盘空间。在Linux环境中,通常会先使用`tar`命令来解压`.tar`文件,然后使用`gzip`命令来解压`.gz`部分。 在标签为空的情况下,我们可以根据标题和...

    jdk1.7-linux

    - 解压缩下载的tar.gz文件,通常使用命令`tar -zxvf jdk1.7.0_55.tar.gz`。 - 将解压后的目录移动到系统路径如 `/usr/lib/jvm` 或者自定义位置。 - 配置环境变量,编辑`~/.bashrc`或`~/.bash_profile`,添加以下行:...

    php-5.4.17.tar.gz

    1. **解压文件**:使用`tar -zxvf php-5.4.17.tar.gz`命令解压缩文件。 2. **配置环境**:进入解压后的目录,然后运行`./configure`命令来检查系统环境并配置编译选项。 3. **编译源代码**:使用`make`命令来编译源...

Global site tag (gtag.js) - Google Analytics