`
John_Kong19
  • 浏览: 279780 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java中打包和解包

阅读更多
package com.test.xml;

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.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class ZipManager {

	/**
	 * 
	 * @param baseDir
	 *            所要压缩的目录名(包含绝对路径)
	 * @param objFileName
	 *            压缩后的文件名
	 * @throws Exception
	 */
	public void createZip(String baseDir, String objFileName) throws Exception {
		File folderObject = new File(baseDir);

		if (folderObject.exists()) {
			List fileList = getSubFiles(new File(baseDir));

			// 压缩文件名
			ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
					objFileName));

			ZipEntry ze = null;
			byte[] buf = new byte[1024];
			int readLen = 0;
			for (int i = 0; i < fileList.size(); i++) {
				File f = (File) fileList.get(i);
				System.out.println("Adding: " + f.getPath() + f.getName());

				// 创建一个ZipEntry,并设置Name和其它的一些属性
				ze = new ZipEntry(getAbsFileName(baseDir, f));
				ze.setSize(f.length());
				ze.setTime(f.lastModified());

				// 将ZipEntry加到zos中,再写入实际的文件内容
				zos.putNextEntry(ze);
				InputStream is = new BufferedInputStream(new FileInputStream(f));
				while ((readLen = is.read(buf, 0, 1024)) != -1) {
					zos.write(buf, 0, readLen);
				}
				is.close();
				System.out.println("done...");
			}
			zos.close();
		} else {
			throw new Exception("this folder isnot exist!");
		}
	}

	/**
	 * zip压缩功能测试. 将指定文件压缩后存到一压缩文件中
	 * 
	 * @param sourceFileName
	 *            所要压缩的文件名
	 * @param zipFilename
	 *            压缩后的文件名
	 * @return 压缩后文件的大小
	 * @throws Exception
	 */
	public long createFileToZip(String zipFilename, String sourceFileName)
			throws Exception {

		File sourceFile = new File(sourceFileName);

		byte[] buf = new byte[1024];

		// 压缩文件名
		File objFile = new File(zipFilename);

		ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFile));

		ZipEntry ze = null;
		// 创建一个ZipEntry,并设置Name和其它的一些属性
		ze = new ZipEntry(sourceFile.getName());
		ze.setSize(sourceFile.length());
		ze.setTime(sourceFile.lastModified());

		// 将ZipEntry加到zos中,再写入实际的文件内容
		zos.putNextEntry(ze);

		InputStream is = new BufferedInputStream(
				new FileInputStream(sourceFile));

		int readLen = -1;
		while ((readLen = is.read(buf, 0, 1024)) != -1) {
			zos.write(buf, 0, readLen);
		}
		is.close();
		zos.close();

		return objFile.length();
	}

	/**
	 * 压缩多个文件
	 * @param zipFileName 
	 * 				要压缩后的压缩文件名
	 * @param lstFileName
	 * 				要压缩的文件名集合
	 * 
	 * @return 压缩后文件大小
	 * @throws Exception
	 */
	public long createFileToZip(String zipFileName, List<String> lstFileName) throws Exception {
		File objFile = new File(zipFileName);
		ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(
				objFile));

		if (lstFileName != null) {
			for (int i = 1; i < lstFileName.size(); i++) {
				File sourceFile = new File(lstFileName.get(i));

				byte[] buf = new byte[1024];

				ZipEntry ze = null;
				// 创建一个ZipEntry,并设置Name和其它的一些属性
				ze = new ZipEntry(sourceFile.getName());
				ze.setSize(sourceFile.length());
				ze.setTime(sourceFile.lastModified());

				// 将ZipEntry加到zos中,再写入实际的文件内容
				zos.putNextEntry(ze);

				InputStream is = new BufferedInputStream(new FileInputStream(
						sourceFile));

				int readLen = -1;
				while ((readLen = is.read(buf, 0, 1024)) != -1) {
					zos.write(buf, 0, readLen);
				}
				is.close();
			}

			zos.close();			
		}
		
		return objFile.length();
	}
	
	/**
	 * zip压缩功能测试. 将指定文件压缩后存到一压缩文件中
	 * 
	 * @param sourceFile
	 *            所要压缩的文件名
	 * @param zipFile
	 *            压缩后的文件名
	 * @return 压缩后文件的大小
	 * @throws Exception
	 */
	public long createFileToZip(File sourceFile, File zipFile)
			throws IOException {

		byte[] buf = new byte[1024];

		// 压缩文件名
		File objFile = zipFile;

		ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(objFile));

		ZipEntry ze = null;
		// 创建一个ZipEntry,并设置Name和其它的一些属性
		ze = new ZipEntry(sourceFile.getName());
		ze.setSize(sourceFile.length());
		ze.setTime(sourceFile.lastModified());

		// 将ZipEntry加到zos中,再写入实际的文件内容
		zos.putNextEntry(ze);

		InputStream is = new BufferedInputStream(
				new FileInputStream(sourceFile));

		int readLen = -1;
		while ((readLen = is.read(buf, 0, 1024)) != -1) {
			zos.write(buf, 0, readLen);
		}
		is.close();
		zos.close();

		return objFile.length();
	}

	/**
	 * @param sourceZip
	 * 				要解压的文件名
	 * @param ourFileName
	 * 				解压后的文件路径
	 * 
	 * @throws IOException
	 */
	public void releaseZipToFile(String sourceZip, String outFileName)
			throws IOException {
		ZipFile zfile = new ZipFile(sourceZip);
		System.out.println(zfile.getName());
		Enumeration zList = zfile.entries();
		ZipEntry ze = null;
		byte[] buf = new byte[1024];
		while (zList.hasMoreElements()) {
			// 从ZipFile中得到一个ZipEntry
			ze = (ZipEntry) zList.nextElement();
			if (ze.isDirectory()) {
				continue;
			}
			// 以ZipEntry为参数得到一个InputStream,并写到OutputStream中
			OutputStream os = new BufferedOutputStream(new FileOutputStream(
					getRealFileName(outFileName, ze.getName())));
			InputStream is = new BufferedInputStream(zfile.getInputStream(ze));
			int readLen = 0;
			while ((readLen = is.read(buf, 0, 1024)) != -1) {
				os.write(buf, 0, readLen);
			}
			is.close();
			os.close();
			System.out.println("Extracted: " + ze.getName());
		}
		zfile.close();

	}

	/**
	 * 取得指定目录下的所有文件列表,包括子目录.
	 * 
	 * @param baseDir
	 *            File 指定的目录
	 * @return 包含java.io.File的List
	 */
	private List getSubFiles(File baseDir) {
		List ret = new ArrayList();
		// File base=new File(baseDir);
		File[] tmp = baseDir.listFiles();
		for (int i = 0; i < tmp.length; i++) {
			if (tmp[i].isFile()) {
				ret.add(tmp[i]);
			}
			if (tmp[i].isDirectory()) {
				ret.addAll(getSubFiles(tmp[i]));
			}
		}
		return ret;
	}

	/**
	 * 给定根目录,返回一个相对路径所对应的实际文件名.
	 * 
	 * @param baseDir
	 *            指定根目录
	 * @param absFileName
	 *            相对路径名,来自于ZipEntry中的name
	 * @return java.io.File 实际的文件
	 */
	private File getRealFileName(String baseDir, String absFileName) {
		String[] dirs = absFileName.split("/");
		// System.out.println(dirs.length);
		File ret = new File(baseDir);
		// System.out.println(ret);
		if (dirs.length > 1) {
			for (int i = 0; i < dirs.length - 1; i++) {
				ret = new File(ret, dirs[i]);
			}
		}
		if (!ret.exists()) {
			ret.mkdirs();
		}
		ret = new File(ret, dirs[dirs.length - 1]);
		return ret;
	}

	/**
	 * 给定根目录,返回另一个文件名的相对路径,用于zip文件中的路径.
	 * 
	 * @param baseDir
	 *            java.lang.String 根目录
	 * @param realFileName
	 *            java.io.File 实际的文件名
	 * @return 相对文件名
	 */
	private String getAbsFileName(String baseDir, File realFileName) {
		File real = realFileName;
		File base = new File(baseDir);
		String ret = real.getName();
		while (true) {
			real = real.getParentFile();
			if (real == null)
				break;
			if (real.equals(base))
				break;
			else {
				ret = real.getName() + "/" + ret;
			}
		}
		System.out.println("TTTTT" + ret);
		return ret;
	}

	public void testReadZip() throws Exception {
		String baseDir = "d:\\temp\\zipout";
		ZipFile zfile = new ZipFile("d:\\download\\src.zip");
		System.out.println(zfile.getName());
		Enumeration zList = zfile.entries();
		ZipEntry ze = null;
		byte[] buf = new byte[1024];
		while (zList.hasMoreElements()) {
			// 从ZipFile中得到一个ZipEntry
			ze = (ZipEntry) zList.nextElement();
			if (ze.isDirectory()) {
				continue;
			}
			// 以ZipEntry为参数得到一个InputStream,并写到OutputStream中
			OutputStream os = new BufferedOutputStream(new FileOutputStream(
					getRealFileName(baseDir, ze.getName())));
			InputStream is = new BufferedInputStream(zfile.getInputStream(ze));
			int readLen = 0;
			while ((readLen = is.read(buf, 0, 1024)) != -1) {
				os.write(buf, 0, readLen);
			}
			is.close();
			os.close();
			System.out.println("Extracted: " + ze.getName());
		}
		zfile.close();
	}

	public static void main(String args[]) {
		ZipManager manager = new ZipManager();
		long l = 0;
		try {
//			manager.createZip("E:\\Test Zip", "E:\\Test Zip.rar");
			manager.releaseZipToFile("E:\\Test Zip.rar", "E:\\Test");
		} catch (Exception e) {
		}
		System.out.println("Result=" + l);
	}

}
分享到:
评论

相关推荐

    java中打包和解包命令

    NULL 博文链接:https://loveseaside.iteye.com/blog/853629

    简易文件打包&解包程序

    在IT领域,文件打包与解包是日常工作中常见的操作,特别是在软件开发、数据传输和备份过程中。本项目名为“简易文件打包&解包程序”,它提供了一种简单易用的方法来整合多个文件到一个单一的压缩包中,以及将这个...

    apk打包解包工具

    "apk打包解包工具"是一类用于处理APK文件的实用程序,它们可以帮助开发者进行APK的构建、拆解、修改和重新签名等操作。下面将详细阐述相关知识点: 1. **APK打包**:APK打包过程是将Android应用的所有资源(如Java...

    行业分类-外包设计-数目可变的位的打包和解包的介绍分析.rar

    在这个上下文中,“数目可变的位的打包和解包”是外包设计项目中可能遇到的一个技术问题,尤其是在处理二进制数据时。以下是对这一主题的详细分析。 打包和解包是计算机科学中处理二进制数据的基本操作。在计算机...

    mstar系列ROM解包打包工具

    【mstar系列ROM解包打包工具】是一款专为乐视超级电视系统设计的工具,它能够对系统的ROM进行解包和打包操作,对于那些希望自定义或优化电视系统的人来说,是必不可少的工具。在这个过程中,我们可以深入理解ROM的...

    晶晨固件解包打包工具。

    在描述中,我们看到"晶晨固件解包打包工具",这表明这是一个集解压和压缩功能于一体的实用程序,针对的是晶晨芯片固件的特殊格式。固件是设备的操作系统和核心软件,它包含驱动程序、应用程序和其他系统组件,直接...

    RDB打包解包工具

    "RDB打包解包工具"就是专门针对这类文件的工具,允许用户对RDB文件进行操作,如打包和解包,以实现自定义皮肤或界面效果。 首先,我们要理解RDB文件的结构。RDB文件是资源数据库的一种形式,它将各种资源,如图片、...

    基于RTP的H264视频数据打包解包类

    本文主要介绍了基于RTP的H264视频数据打包解包类,包括RTP打包类和解包类的设计和实现细节。同时还介绍了NAL单元包和FU-A分片单元包的实现机制,以及丢包处理策略的设计。 1. H.264视频数据打包类设计 H.264视频...

    apk解包打包工具

    常用的apk解包工具有JD-GUI(Java反编译器)和Apktool。你可以从官方网站或可靠的第三方网站获取这些工具。例如,Apktool用于解析APK的资源文件,JD-GUI则用于查看反编译后的Java源代码。 2. **运行Apktool解包**:...

    易语言-jar打包和解包工具

    "易语言-jar打包和解包工具" 是一个专门为易语言用户设计的实用程序,可以帮助开发者将易语言编译的Java类文件打包成JAR,或者将已有的JAR文件解包以便查看和编辑其中的内容。这个工具的源码提供给了用户,这样他们...

    RK/..打包解包

    打包解包"可能指的是一个特定的打包工具或者流程,但没有提供具体的信息,我将从通用的角度来解释这两个概念。 **打包(Packaging)** 打包是指将多个文件或文件夹合并成一个单一的文件,通常是为了方便传输、存储...

    图形化apk打包解包签名工具apktool.rar

    为了使这些过程更为便捷,出现了许多工具,其中图形化apk打包解包签名工具apktool因其易用性和实用性而备受青睐。本文将深入探讨apktool的使用方法及其实现原理,帮助开发者更好地理解和运用这一工具。 首先,我们...

    apk打包解包签名工具

    在Android应用开发领域,APK打包解包签名工具有着至关重要的作用,它们帮助开发者进行应用的调试、修改和发布。本篇文章将详细介绍其中的核心工具——`apktool`,以及与之相关的签名过程。 首先,`apktool`是一款...

    固件解包打包

    固件解包打包是IT行业中一个重要的操作,尤其在设备固件更新和定制化系统开发时经常用到。固件通常是指嵌入在硬件设备中的软件部分,它控制着设备的功能和行为。在这个教程中,我们将专注于Novo8设备的固件修改过程...

    APK打包解包签名工具集

    总的来说,APK打包、解包和签名是Android应用开发的重要环节,而"APK打包解包签名工具集"这类工具则提供了更为高效和便捷的方式,使得开发者能够专注于应用的功能实现和优化,而不是在这些基础操作上花费过多时间。...

    apktool解包打包工具

    这个工具的核心功能包括解析APK资源、反编译Dalvik字节码(DEX)到Java源代码、编辑资源和XML配置文件,以及将修改后的内容重新打包回APK。 在使用apktool进行解包时,你需要遵循以下步骤: 1. **下载和安装**: ...

    apk解包打包修改汉化工具软件

    总之,“apk解包打包修改汉化工具软件”为Android开发和逆向工程提供了便利,但同时也需要理解其背后的法律和安全问题。掌握这些技能可以帮助你更好地理解和定制Android应用,但务必在合法范围内使用。

    APK文件的解包打包和修改

    ### APK文件的解包、打包和修改详解 #### 一、APK文件简介 APK是Android Package的缩写,即Android应用包(Android application package)。它是Android平台上应用程序的安装包,任何要在Android设备上安装的应用都...

    apktool解包打包apk

    Apktool是一款强大的开源工具,它允许我们对APK进行解包、反编译、修改和重新打包,从而帮助开发者和安全研究人员更好地理解和定制Android应用。 ### 一、Apktool简介 Apktool由IzzySoft开发,主要用于处理APK文件...

    android apk 打包解包工具

    至此,我们完成了APK的打包、解包、修改和签名流程。"apktools"作为开发者的重要工具,帮助我们深入了解APK内部结构,进行定制化修改,并准备发布。在实际开发中,理解并掌握这些步骤对于调试、优化和保护Android...

Global site tag (gtag.js) - Google Analytics