今年的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包里面的类也是用诸多简之又简的知识点来写的,换句话说你我也可以写一个这样的类出来,且不论其现实可能性。值得思考的是,往往每日接触了,却思想被囿于一隅了,也就是麻木。