文档章节

文件解压缩

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
私信 提问
解决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
Linux文件压缩:gzip、bzip2、xz

常见压缩格式Windows:.rar、.zip、.7zLinux :.zip、.gz、.bz2、.xz、.tar.gz、.tar.bz2、.tar.xz 一、gzip压缩命令 gzip命令用来压缩文件。gzip是个使用广泛的压缩程序,文件经它压缩过后,...

BatmanLinux
2018/01/05
0
0
基于hi-linu基于hi-linux的busybox命令学习-bunzip2、bzip2、compress

bunzip2 功能说明:.bz2文件的解压缩程序。.bz2文件的解压缩程序。 格式:bunzip2 [-fkLsvV][.bz2压缩文件]bunzip2 [-fkLsvV][.bz2压缩文件] 主要参数: -f或--force  解压缩时,若输出的文...

GIT-YCJ
2015/10/27
1
0
6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具

6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具 6.1 压缩打包介绍 文件压缩的理由: 节省空间 方便传输 节省带宽资源 常见的压缩文件的后缀名: Windows : .rar、.zip、...

JasonYan86
2018/06/29
0
0
小蚂蚁学习Linux(6)——压缩与解压缩命令详解

在Linux中常用的压缩格式有以下几个:.zip .gz .bz2 .tar.gz tar.bz2。首先先解释前三个。 .zip格式的压缩: zip 压缩文件名 原文件名 如:zip abc.zip abc 后缀名是一定要写的,虽然Linux不...

嗜学如命的小蚂蚁
2015/11/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周三乱弹 —— 孤独到都和病毒发生了感情了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @-冰冰棒- :#今日歌曲推荐# 逃跑计划《一万次悲伤 (Live)》 《一万次悲伤 (Live)》- 逃跑计划 手机党少年们想听歌,请使劲儿戳(这里) 现在...

小小编辑
41分钟前
13
4
test

//// main.c// Test//// Created by 吕颖 on 2019/1/16.// Copyright © 2019年 carmen. All rights reserved.//#include <stdio.h>#include <stdlib.h>#include <t......

carmen-ly
今天
1
0
Android webview热门组件agentweb:4.0.2无法自适应的问题

Android webview热门组件agentweb:4.0.2无法自适应的问题 //设置自适应屏幕,两者合用mAgentWeb.getAgentWebSettings().getWebSettings().setUseWideViewPort(true); //将图片调整到适合w...

Gemini-Lin
今天
5
0
如何维护一个自己的 golang doc 服务

本文内容是如何维护一个golang 在线的doc 服务。 1 什么是godoc ? godoc 是 golang 官方提供的文档生成工具, 2 为什么要有godoc ? 我们经常遇到一个问题,就是代码和文档不一致,线上代码版...

鼎铭
今天
5
0
js中的对象创建的模式以及继承模式

对象创建模式: 工厂模式 构造函数模式 原型模式 继承模式 原型式继承 寄生式继承 构造函数 原型式和构造函数的组合式(缺点:运行两次超类类函数,积累函数的属性被挂载在原型对象上和实例对...

莫西摩西
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部