`
John_Kong19
  • 浏览: 272641 次
  • 性别: 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

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

    RTP的H264视频数据打包解包类说明,H264 RTP打包类、解包类,实现了单个NAL单元包和FU_A分片单元包。对于丢包处理,采用简单的策略:丢弃随后的所有数据包,直到收到关键帧

    Java打包成exe软件

    exe4j破解版 里面有一个Keygen_install4j58 解压里面有个class文件,然后再cmd下java 运行下就回生成注册码了。

    刷机包system.new.dat解包打包工具

    已测试5.0-8.0的rom解包打包全部正常,9.0未测试,非常好用的解包打包工具,需要安装安装java环境,内附相关说明。

    固件解包打包

    Novo8的简易固件修改教程,非常容易,相信读过之后,也能轻松简单的修改固件。

    一键轻松反编译解包+重新打包安卓APP 神器下载

    今天电脑极客小编要为大家准备一枚APP反编译解包打包神器,真正实现一键自动搞定,新人也能分分钟会用哟~ 先来说说为嘛要对安卓APP进行反编译?由于 Android 平台过于开放的系统特性,各大市场APP软件质量良莠不齐,...

    asn.1 的国际标准打包

    从官方网站下载的 asn.1 的国际标准打包。

    Java实现Rtsp数据拆包组帧成H264帧

    利用java实现了Rtsp网络数据的拆包组帧转换为H264数据帧。

    plist解包工具

    tp等打包工具打出来的plist和png的解包工具。 用法: 1、将xxx.plist和xxx.png放在同一个目录下 2、选择这个目录,点击导出文件即可 3、导出的文件会在工作目录创建一个同名的文件夹,切片文件会生成在里面 注意:...

    JAVA文件压缩与解压缩实践的实现.rar

    Java文件压缩与解压缩实践是指利用Java编程语言实现对文件或文件夹进行压缩和解压缩操作。以下是该实践的描述: ...通过Java文件压缩与解压缩实践,可以方便地对文件进行打包和解包操作,提高文件的管理和传输效率。

    Java开发技术大全(500个源代码).

    GcdAndGcm.java 求最大公约数和最小公倍数 errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 ...

    apk反编译,打包及签名工具(附详细使用说明)

    apktool.jar用于解包,apktool.jar和aapt.exe联合用于打包。 signapk.jar 用于签名。 2) APK文件的解包 下面以解开Contacts.apk为例。首先把Contacts.apk Copy到当前工作目录下(例:Test)。在DOS下打入命令 ...

    java常用工具类打包下载

    J2EE常用工具类汇总 J2EE常用工具类—Value Object工具类 ...J2EE常用工具类—文件打包解包处理类 J2EE常用工具类——文件操作类 J2EE常用工具类——邮件处理类(javaMail发送邮件) J2EE常用工具类——字符串工具类

    JAVA自学之路 七路线图明细

    一:J2SE 面向对象-封装、继承、多态 内存的分析 递归 集合类、泛型、自动打包与解包、Annotation

    java解析json所需要的jar包

    在用java写爬虫的时候需要用jsonobject解析json数据,需要导入多个包

    Java-2017 jdk6 runtime .pkg.zip

    2.解包安装包 pkgutil --expand /Volumes/Java\\ for\\ macOS\\ 2017-001/JavaForOSX.pkg /tmp/setup 3.修改判断文件,让高版本判断失效 sed -i '' 's/return false/return true/g' /tmp/setup/Distribution ...

    智能文章标题截取功能 专辑增加投稿开放模式 Lerx开源网站内容管理系统(CMS.ext) v6.6.5 JAVA源码

    5.具有能提供一键式打包、解包、上传、下载、无配置式布署的自由开放的智能模板市场。 6.提供手机端模块进行服务器及网站状态实时状态监测。 7.提供了防重式文件上传模块。通过上传文件去重复功能,避免了不必要的...

    J2ME(JAVA通用) TAR打包源码

    本人原创的J2ME上的TAR打包源码,不支持 解包。 J2SE也可以用。

    java笔试题输出结果-java-json-benchmark:JavaJSON库序列化和反序列化的性能测试

    如果可用,数据绑定和“流”(自定义打包和解包)实现都经过测试。 使用 1、10、100 和 1000 KB 大小的有效负载评估两种不同类型: :使用原始类型、字符串、列表和简单的 POJO; 和 : 添加数组、枚举、UUID、...

    apk工具包附带反编译apk完整步骤

    工具清单: apktool_2.3.3.jar 打包/解包APK程序 smali.xml Notepad++ smali语言模板 jadx java反编译器,支持jar,aar,dex,apk的反编译 反编译APK完整方法: 1.安装 java jdk 官网可下载 ...

Global site tag (gtag.js) - Google Analytics