文档章节

文件解压缩

yabushan
 yabushan
发布于 2016/04/16 16:02
字数 774
阅读 41
收藏 4

1

package com.yabushan.test.util.upload;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipFile;
import org.apache.tools.zip.ZipOutputStream;
import org.slf4j.LoggerFactory;

public class ZipUtil {
	protected static final org.slf4j.Logger log = LoggerFactory.getLogger(ZipUtil.class);
	private static final int BUFFER = 2048;

	/**
	 * 解压文件到指定路径
	 * 
	 * @param filePath
	 * @param upZipPath
	 * @return 返回解压的文件集合
	 */
	public static List<File> unZip(String filePath, String upZipPath) {
		List<File> list = new ArrayList<File>();
		int count = -1;
		File file = null;
		InputStream is = null;
		FileOutputStream fos = null;
		BufferedOutputStream bos = null;
		// 生成指定的保存目录
		String savePath = upZipPath;
		if (!new File(savePath).exists()) {
			new File(savePath).mkdirs();
		}

		try {
			ZipFile zipFile = new ZipFile(filePath, "GBK");
			Enumeration enu = zipFile.getEntries();
			while (enu.hasMoreElements()) {
				ZipEntry zipEntry = (ZipEntry) enu.nextElement();
				if (zipEntry.isDirectory()) {
					new File(savePath + "/" + zipEntry.getName()).mkdirs();
					continue;
				}
				if (zipEntry.getName().indexOf("/") != -1) {
					new File(savePath
							+ "/"
							+ zipEntry.getName().substring(0,
									zipEntry.getName().lastIndexOf("/")))
							.mkdirs();
				}
				is = zipFile.getInputStream(zipEntry);
				file = new File(savePath + "/" + zipEntry.getName());
				fos = new FileOutputStream(file);
				bos = new BufferedOutputStream(fos, BUFFER);

				byte buf[] = new byte[BUFFER];
				while ((count = is.read(buf)) > -1) {
					bos.write(buf, 0, count);
				}

				bos.flush();
				fos.close();
				is.close();
				list.add(file);
			}

			zipFile.close();
			return list;
		} catch (IOException ioe) {
			log.error(ioe.getMessage());
			return list;
		}
	}

	/**
	 * RAR 需要配置rar路径
	 * 
	 * @param filePath
	 * @param unRarPath
	 *            路径要唯一,否则获取文件列表会出错
	 * @return
	 */
	public static int unRar(String filePath, String unRarPath) {
		int result = -99;
		if (!(new File(unRarPath).exists())) {
			new File(unRarPath).mkdirs();
		}
		try {
			//String cmd = GlobalConfig.getConfigValue("cmd.path");
			String cmd="test";
			String unrarCmd = cmd + " e -r -o+ " + filePath + " " + unRarPath;
			Runtime rt = Runtime.getRuntime();

			Process pre = rt.exec(unrarCmd);
			while(result==-99){
			try {
				Thread.sleep(1000L);
				result = pre.exitValue();
			} catch (Exception e) {
				// TODO: handle exception
				result = -99;
			}
			}
			InputStreamReader isr = new InputStreamReader(pre.getInputStream());
			BufferedReader bf = new BufferedReader(isr);
			String line = null;
			while ((line = bf.readLine()) != null) {
				line = line.trim();
				if ("".equals(line)) {
					continue;
				}
				log.info(line);
			}
			bf.close();
			if (result != 0) {
				log.error("unRar " + pre.exitValue());
			}
			// 杀死进程 退出
			// pre.destroy();
			return result;
		} catch (Exception e) {
			log.error(e.getMessage() + ": " + e.getStackTrace());
			return -2;
		}
	}

	/***
	 * 将多个文件打成压缩包
	 * 
	 * @param list
	 *            需打包的文件路径集合
	 * @param zipfilename
	 *            压缩包名称
	 */
	public static void listToZip(List<String> list, String zipfilename) {
		FileInputStream is = null;
		String path = "";
		File file = null;
		ZipOutputStream zos = null;
		try {
			if (list != null && list.size() > 0) {
				//String uri = GlobalConfig.getConfigValue("zipFile.path");
				String uri="D:/ZIP";
				File f = new File(uri);
				if(!f.exists()){
					f.mkdirs();
				}
				zipfilename = uri + zipfilename;
				//创建zip文件输出流
				zos = new ZipOutputStream(new FileOutputStream(new File(
						zipfilename)));
				zos.setEncoding("GBK");
				for (int i = 0; i < list.size(); i++) {
					path = list.get(i);
					file = new File(path);
					if (file.exists()) {
						//创建源文件输入流
						is = new FileInputStream(file);
						zos.putNextEntry(new ZipEntry(file.getName()));
						byte[] buf = new byte[BUFFER];
						int length = -1;
						while ((length = is.read(buf)) != -1) {
							zos.write(buf, 0, length);
							zos.flush();
						}
						zos.closeEntry();
						is.close();
					} else {
						System.out.println("源文件不存在");
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (is != null) {
					is.close();
				}
				if (zos != null) {
					zos.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}

		}

	}
	/***
	 * 将多个文件打成压缩包(压缩包内文件名称由参数中传入)
	 * 
	 * @param list
	 *            需打包的文件信息集合
	 * @param zipfilename
	 *            压缩包名称
	 */
	public static void listMapToZip(List<Map<String,Object>> list, String zipfilename) {
		FileInputStream is = null;
		String path = "";
		File file = null;
		ZipOutputStream zos = null;
		try {
			if (list != null && list.size() > 0) {
				//String uri = GlobalConfig.getConfigValue("zipFile.path");
				String uri="D:/ZIP";
				File f = new File(uri);
				if(!f.exists()){
					f.mkdirs();
				}
				zipfilename = uri + zipfilename;
				//创建zip文件输出流
				zos = new ZipOutputStream(new FileOutputStream(new File(
						zipfilename)));
				zos.setEncoding("GBK");
				for (Map map : list) {
					path = map.get("filePath")+"";
					file = new File(path);
					if (file.exists()) {
						//创建源文件输入流
						is = new FileInputStream(file);
						zos.putNextEntry(new ZipEntry(map.get("fileName")+""));
						byte[] buf = new byte[BUFFER];
						int length = -1;
						while ((length = is.read(buf)) != -1) {
							zos.write(buf, 0, length);
							zos.flush();
						}
						zos.closeEntry();
						is.close();
					} else {
						System.out.println("源文件不存在");
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (is != null) {
					is.close();
				}
				if (zos != null) {
					zos.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}

		}

	}
	public static void main(String[] args) throws Exception {
		List<String> list = new ArrayList<String>();
		list.add("D:/File/img/tempImg/7f7ffd45856be6aa.txt");
		list.add("D:/File/img/tempImg/63f8959465093ec0.jpeg");
		list.add("D:/File/img/tempImg/815b476dc8cf790e.txt");
		list.add("D:/File/img/tempImg/4451519220dad91a.txt");
		//ZipUtil.listToZip(list, "测试.zip");
		
		System.out.println(ZipUtil.unZip("D:/ZIP测试.zip", "D:/ZIP/bb/").toString());
		//Map map = new HashMap<String, Object>();
		//map.put("我", null);
		//System.out.println(String.valueOf(map.get("我")));
	}
}


© 著作权归作者所有

共有 人打赏支持
yabushan
粉丝 1
博文 38
码字总数 34355
作品 0
CentOS7,使用tar命令解压缩文件

我们经常会遇到打包成.gz格式的压缩包,这种包不是可执行自动安装包,这种包相当于是个zip包,其安装过程就是手动解压缩、编辑配置文件、配置环境变量的过程。通过以下命令可以加压缩一个gz文...

rickqin
2016/05/05
0
0
Android Zip文件解压缩代码

在Android平台中如何实现Zip文件的解压缩功能呢? 因为Android内部已经集成了zlib库,对于英文和非密码的Zip文件解压缩还是比较简单的,下面给大家一个解压缩zip的 java代码,可以在Android...

冯京宝
2012/09/28
0
0
文件压缩、解压缩以及归档工具详解

一、简介 早期的有compress和uncompress,其对应的是.Z结尾的压缩格式文件;现在使用较多的有: gzip/gunzip,其对应的是.gz结尾的压缩格式文件; bzip2/bunzip2其对应的是.bz2结尾的压缩格式...

wzcLINUXER
06/29
0
0
解决ubuntu下打不开rar文件

方法一: 安装 rar 解压缩文件: sudo apt-get install rar 解压缩 rar 文件: rar e myfile.rar 安装 7zip 解压缩工具: sudo apt-get install p7zip p7zip 包括 p7zip 和 7zr 两个可执行文...

小猴纸
2012/10/05
0
0
CNNVD 关于手机程序第三方解压缩库输入验证安全漏洞情况的通报

  近日,国家信息安全漏洞库(CNNVD)收到关于手机程序第三方解压缩库输入验证安全漏洞(CNNVD-201805-440)情况的报送。成功利用该漏洞的攻击者,可以远程读取应用数据、甚至执行任意代码...

FreeBuf
05/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

虚拟机学习之二:垃圾收集器和内存分配策略

1.对象是否可回收 1.1引用计数算法 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时候计数器值为0的对象就是不可能...

贾峰uk
35分钟前
0
0
smart-doc功能使用介绍

smart-doc从8月份底开始开源发布到目前为止已经迭代了几个版本。在这里非常感谢那些敢于用smart-doc去做尝试并积极提出建议的社区用户。因此决定在本博客中重要说明下smart-doc的功能,包括使...

上官胡闹
昨天
5
0
JavaEE——Junit

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Junit Junit又名单元测试,Junit是用来测试Jav...

凯哥学堂
昨天
2
0
读《美丽新世界》

一、背景 十一国庆节从重庆回深圳的时候,做得绿皮车,路上看了两本书:李笑来的《韭菜的自我修养》和禁书《美丽新世界》。 上篇文章已经分享了 读《韭菜的自我修养》,这篇文章来记录一下《...

tiankonguse
昨天
1
0
archlinux下基于Jenkins,docker实现自动化部署(持续交互)

本文永久更新地址:https://my.oschina.net/bysu/blog/2250954 【若要到岸,请摇船:开源中国 不最醉不龟归】 -----------------------------------第一部分Jenkins的安装与使用-----------...

不最醉不龟归
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部