使用JAVA自带的zipInputStream进行解压缩文件包的操作

package com.ffcs.icity.common.util;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * 提供的针对文件的加压解压的操作工具类
 * @author linwei
 *
 */
public class ZipUtil {

	private final static Logger log = LoggerFactory.getLogger(ZipUtil.class);
	
	/**
	 * 执行压缩文件的解压,并自动生成文件的操作
	 * @param in
	 * @param outputDirectory
	 * @return
	 * 
	 */
	public static Map<String,Object> unZip(InputStream in,String outputDirectory){
		
		if(in == null) 
			return null;
		
		ZipEntry zipEntry = null;
		FileOutputStream out = null;
		String uniqueName,iconUrl = null;
		Map<String,Object> map = new HashMap<String,Object>();
		ZipInputStream zipIn = new ZipInputStream(in);
		try{
			while ((zipEntry = zipIn.getNextEntry()) != null) {
				//如果是文件夹路径方式,本方法内暂时不提供操作
				if (zipEntry.isDirectory()) {
//					String name = zipEntry.getName();
//					name = name.substring(0, name.length() - 1);
//					File file = new File(outputDirectory + File.separator + name);
//					file.mkdir();
				} 
				else {
					//如果是文件,则直接在对应路径下生成	
					uniqueName = getSavedFileName(zipEntry.getName());
					File path = new File(outputDirectory + File.separator);
					if(!path.exists())
						path.mkdirs();
					
					iconUrl = outputDirectory + File.separator + uniqueName;
					File file = new File(iconUrl);
					file.createNewFile();
					out = new FileOutputStream(file);
					int b = 0;
					while ((b = zipIn.read()) != -1){
						out.write(b);
					}
					out.close();
					map.put(zipEntry.getName(),iconUrl);
				}
			}
			return map;
		} catch(Exception ex){
			log.error("in unZip(InputStream in,String outputDirectory) has an error,e is " + ex);
			return null;
		}
		finally{
			IOUtils.closeQuietly(zipIn);
			IOUtils.closeQuietly(in);
			IOUtils.closeQuietly(out);
		}
	}
	
	/**
	 * 解压压缩文件流,并根据解压层次来判断,是否只解析第一层,还是解析所有数据
	 * map<name,inputstream>
	 * @param in
	 * @param parseLevel
	 * @return
	 */
	public static Map<String,Object> unZip(InputStream in,int parseLevel){
		
		if(in == null) 
			return null;
		
		ZipEntry zipEntry = null;
		FileOutputStream out = null;
		Map<String,Object> map = new HashMap<String,Object>();
		ZipInputStream zipIn = new ZipInputStream(in);
		try{
			while ((zipEntry = zipIn.getNextEntry()) != null) {
				//如果是文件夹路径方式,本方法内暂时不提供操作
				if (zipEntry.isDirectory()) {
//					String name = zipEntry.getName();
//					name = name.substring(0, name.length() - 1);
//					File file = new File(outputDirectory + File.separator + name);
//					file.mkdir();
				} 
				else {
					//如果是文件,则直接存放在Map中
					String name = zipEntry.getName();
					//把压缩文件内的流转化为字节数组,够外部逻辑使用(之后关闭流)
					byte[] bt = IOUtils.toByteArray(zipIn);
					map.put(name,bt);
				}
			}
			return map;
		} catch(Exception ex){
			log.error("in unZip(InputStream in,int parseLevel) has an error,e is " + ex);
			return null;
		}
		finally{
			IOUtils.closeQuietly(zipIn);
			IOUtils.closeQuietly(in);
			IOUtils.closeQuietly(out);
		}
		
		
	}

	
	
	/**
	 * 根据传递的文件名(带后缀)生成唯一新文件名(带后缀)
	 * @param origFileName
	 * @return 
	 */
	private static String getSavedFileName(String origFileName) {
		return DateHelper.getCurrentTimeStamp("yyyyMMddHHmmss") + "-" + RandomStringUtils.randomNumeric(5) + "." + FilenameUtils.getExtension(origFileName);
	} 
	
	
	public static void main(String[] args) throws IOException {
		
//		FileInputStream in = new FileInputStream(new File("d:\\Temp\\Temp.zip"));
//		Map map = unZip(in,0);
//		System.out.println("map is " + map.size());
		
//		byte[] bt = (byte[])map.get("ziptest.zip"); 
		byte[] bt = null;
		InputStream in1 = new ByteArrayInputStream(bt);
//		unZip(in1,"d://test");
		System.err.println("over.");
	}
	
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中可以使用ZipInputStream和GZIPInputStream压缩压缩文件,其中ZipInputStream可以处理嵌套的压缩文件。 以下是一个用Java压缩嵌套的压缩文件的示例代码: ```java import java.io.*; import java.util.zip.*; public class UnzipExample { public static void unzip(File zipFile, File destination) throws IOException { byte[] buffer = new byte[1024]; try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) { ZipEntry zipEntry = zis.getNextEntry(); while (zipEntry != null) { File newFile = newFile(destination, zipEntry); if (zipEntry.isDirectory()) { if (!newFile.isDirectory() && !newFile.mkdirs()) { throw new IOException("Failed to create directory " + newFile); } } else { File parent = newFile.getParentFile(); if (!parent.isDirectory() && !parent.mkdirs()) { throw new IOException("Failed to create directory " + parent); } try (FileOutputStream fos = new FileOutputStream(newFile)) { int len; while ((len = zis.read(buffer)) > 0) { fos.write(buffer, 0, len); } } } zipEntry = zis.getNextEntry(); } } } private static File newFile(File destinationDir, ZipEntry zipEntry) throws IOException { File destFile = new File(destinationDir, zipEntry.getName()); String destDirPath = destinationDir.getCanonicalPath(); String destFilePath = destFile.getCanonicalPath(); if (!destFilePath.startsWith(destDirPath + File.separator)) { throw new IOException("Entry is outside of the target directory: " + zipEntry.getName()); } return destFile; } public static void main(String[] args) throws IOException { File zipFile = new File("example.zip"); File destination = new File("unzipped"); unzip(zipFile, destination); } } ``` 该示例代码使用了try-with-resources语句来确保关闭流,它还含了一个newFile()方法,该方法用于检查压缩文件的目录是否在指定的目标目录中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值