文档章节

文件解压缩

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
文件压缩、解压缩以及归档工具详解

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

wzcLINUXER
06/29
0
0
Android Zip文件解压缩代码

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

冯京宝
2012/09/28
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
解决ubuntu下打不开rar文件

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

猴纸
2012/07/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

异步化,高并发大杀器

今天来聊聊如何让项目异步化的一些事。 在进入正文之前,顺便给大家推荐一个Java架构方面的交流学习群:698581634,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分...

Java大蜗牛
11分钟前
0
0
织梦dedecms安全设置

网站本身做好防范: 1、修改默认后台名。 打开网站根目录,找到[dede],这个文件夹就是后台的路径,可以随意修改,比如修改为[adminbuy],此时后台登陆的路径为:http://www.*****.com/admi...

雨季2014
11分钟前
0
0
完美Python入门基础知识点总结,看完你的Python就完全入门了!

Python标识符 在 Python 里,标识符有字母、数字、下划线组成。 在 Python 中,所有标识符可以包括英文、数字以及下划线(_),但不能以数字开头。 Python 中的标识符是区分大小写的。 以下划线...

糖宝lsh
18分钟前
0
0
Java关于前后台传输中文乱码以及Excel下载乱码解决

针对乱码,一般情况是前后台以及中间件编码格式不同导致.故需要保证编码格式相同即可. 1.前台页面格式指定,这里用的是jsp,故需要将pageEncoding指定为"UTF-8" 2.指定服务器编码格式,比如用的t...

勤奋的蚂蚁
20分钟前
0
0
Flutter组件 - Flexible

Flexible是一个控制Row、Column、Flex等子组件如何布局的组件。 Flexible组件可以使Row、Column、Flex等子组件在主轴方向有填充可用空间的能力(例如,Row在水平方向,Column在垂直方向),但是...

一箭落旄头
23分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部