7月的故事---JAVA与ZIP包

今年的7月的北京总下雨,还出事儿,甚至让市长下了台。但多于我无关,只是上班骑车少了、回家晚了,但气温降下来了、睡觉也踏实了、做东西也踏实。值得记住那些。

本篇是记录JAVA封装、解压ZIP包的,用的是JAVA.UTIL.ZIP包里面的类,很容易实现,但也存在一些与生俱来的不足。

先粘一段代码:压缩、解压类。

/**
 * 
 */
package com.javazip;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

/**
 * @author wkupaochuan
 * @time Jul 26, 2012
 * @version V 1.0
 */
public class ZipTest {
	
	
	public static void main(String agrs[])
	{
		//压缩
		zip();
		
		//解压缩
		unzip();
	}
	
	
	/*压缩*/
	public static void zip()
	{
		//压缩文件的存储路径
		
		String outFilename = null;
		
		//带压缩的文件夹,要注意文件夹中不要含有文件夹,java.util.zip不支持压缩文件夹。
		
		String inDirec = null;
		
		try {
			
			if( null == outFilename)
			{
				outFilename = "E:\\2\\test.zip";
			}
			
			//输出流,将压缩后的内容输出到压缩文件中去
			
			FileOutputStream fos = new FileOutputStream(outFilename);
			
			//zip输出流
			ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(fos)); 
			
			//输入流是从各个待压缩文件得到的
			
			BufferedInputStream bis = null;
			
			if(null == inDirec)
			{
				inDirec = "E:\\2";
			}
			
			//得到文件夹中的所有文件,并循环作为输入流,进行压缩.
			
			File[] files = new File(inDirec).listFiles();
			
			int BUFFER = 1024;
			
			for(File f: files)
			{
				//输入流
				
				bis = new BufferedInputStream(new FileInputStream(f), BUFFER);
				
				//创建新的ZIP条目
				
				ZipEntry ze = new ZipEntry(f.getName());

				//向输出流中添加条目
				
				zos.putNextEntry(ze);
				
				byte[] b = new byte[BUFFER];
				
				int len = 0;
				
				//从待压缩文件读取内容,并输出到压缩文件
				
				while((len = bis.read(b)) != -1)
				{
					zos.write(b, 0, len);
				}
			}
			
			//清空并关闭流
			
			zos.flush();
			
			zos.close();
			
			bis.close();
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
	
	/*解压缩*/
	public static void unzip()
	{
		try {
			
			//解压文件存储路径
			
			String filePath = "E:\\2\\";
			
			//待解压文件
			
			ZipFile zf = new ZipFile(filePath + "test.zip");
			
			//输出流,要输出到多个文件
			
			BufferedOutputStream bos = null;
			
			//输入流,要从ZIP包中的文件分别读取
			
			BufferedInputStream bis = null;
			
			//获取ZIP文件中的所有条目
			
			Enumeration en = zf.entries();
			
			while(en.hasMoreElements())
			{
				//下一个条目
				
				ZipEntry ze = (ZipEntry)en.nextElement();
				
				//根据条目的名称,建立解压后的文件
				
				File f = new File(filePath + "1\\" + ze.getName());
				
				if(!f.exists())
				{
					f.createNewFile();
				}
				
				//输入流
				
				bis = new BufferedInputStream(zf.getInputStream(ze));
				
				//建立输出到新建文件的输出流
				
				bos = new BufferedOutputStream(new FileOutputStream(f));

				byte[] b = new byte[1024];
				
				int len = 0;
				
				while((len = bis.read(b)) != -1)
				{
					bos.write(b, 0, len);
				}
				
				//关闭流,这个地方要注意,解压完每个条目之后都要清空输出流bos.flush,否则只有最后一个解压文件有内容。
				
				bos.flush();
				
				bos.close();
				
				bis.close();
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}

}

         思路很简单。压缩文件:建立到压缩文件的输出流zipOutputStream---->建立从待压缩文件输入的输入流----->向输出流中加入新条目zipEntry----->读取、输出---->清空、关闭流.

                        解压文件:建立压缩文件ZipFile---->获取压缩文件中的所有条目zipFile.entries---->根据压缩文件中的条目建立文件ZipEntry.getName()--->建立到新建文件的输出流---->建立从新条目输入的输入流inputStream(zipEntry)---->输出、清空输出流.

当然,存在简单的一面,就必然有缺憾的一面。java.uti.zip不支持压缩文件夹;windows环境下查看压缩文件,文件内容会出现中文乱码,但用相应的程序解压后乱码消失。关于乱码是因为java默认用utf-8处理,但是windows默认使用iso-8895-1处理。如果要解决可以去找apache相应的jar包ant来处理。

         再者,本来是毫不知道JAVA可以操作压缩包的,没想过我所学过的语言可以操作我平时所经常使用的东西。后来有人指点说,其实这个ZIP包里面的类也是用诸多简之又简的知识点来写的,换句话说你我也可以写一个这样的类出来,且不论其现实可能性。值得思考的是,往往每日接触了,却思想被囿于一隅了,也就是麻木。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值