Java文件压缩与解压缩(三)(一)

2014-11-24 10:55:44 · 作者: · 浏览: 0
[java]
package com.cn;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
//错误小结:
//1 关于file.isFile()与file.isDirectory()记忆出了偏差.
// 错误以为若是Directory一定是file,file不一定是Directory
// 更正:file和Directory是两码事.只能是file或Directory中其中一个.
// 要看的1 传入一个路径直接压缩了.
//2 血的教训:
// zip()方法中没有关闭流zos.导致压缩后的文件解压时出错
//重要总结:
//1 关于zip和unzip的核心操作对象是每一个文件!!!
// 比如碰到一个directory,那么会去遍历里面的每一个文件,挨个对其进行压缩.
// 不要错误地理解,若是一个directory,那么会将其作为一个整体进行压缩.
//2 在JAVA中每一个压缩文件都用一个ZipEntry表示
// 所以在压缩的过程中要得到每个文件的完整路径(从最外层文件夹至文件本身)
// 用此完整路径为每个压缩文件new()一个ZipEntry
//3 所以利用zipEntry可记录原来的目录层次.解压后才保持原样
// 也可以看到在解压时利用entrys.hasMoreElements()来挨个
// 解压每个zipEntry.
// 参见解压中的代码:
// new File(unzipPath+File.separator+entry.getName());
public class TestZipAndUnZip {
public static void main(String[] args) throws Exception {
TestZipAndUnZip test=new TestZipAndUnZip();
//将某一个文件压缩成zip
// test.zip("E:\\", "aa\\1.txt", "E:\\cc1.zip");
//将某一个目录压缩成zip
//test.zip("E:\\aa", "bb\\", "E:\\zz.zip");//right
// test.zip("F:\\", "kk", "F:\\zz678910.zip");//right
//
//// //将某一个zip解压
// test.unZipFile("F:\\zz678910.zip", "E:\\zzzz");
/////////////////////以下正确///////////////////////////////
//压缩和解压单个文件
// test.zip2("E:\\aa\\1.txt","E:\\aaaaaaa\\aa1234.zip");
// test.unZipFile2("E:\\aaaaaaa\\aa1234.zip", "E:\\aaaaaaa\\aaxixihaha");
//压缩和解压一个目录
test.zip2("F:\\kk","F:\\4zip.zip");
test.unZipFile2("F:\\4zip.zip", "F:\\4files");
/////////////////////以上正确//////////////////////////////
}
/**
* @param willZipDirPath 被压缩文件(目录)所在目录
* @param willZipFileName 被压缩文件(目录)的名称
* @param toFilePath 压缩后文件(目录)名
*/
public void zip(String willZipDirPath, String willZipFileName, String zipedFileName) {
System.out.println("…………………以下为zip()方法…………………………");
if (willZipDirPath == null) {
return;
}
File willZipDir = new File(willZipDirPath);
if (!willZipDir.exists() || !willZipDir.isDirectory()) {
return;
}
// 获得目录绝对路径
String willZipDirAbsolutePath = willZipDir.getAbsolutePath();
System.out.println("willZipDir.getAbsolutePath()="+willZipDirAbsolutePath);
//压缩后的文件
File zipedFile = new File(zipedFileName);
try {
//从压缩后的文件得到压缩输出流ZipOutputStream
//这里的zos只指向了压缩后文件的最外层.那么它怎么
//维持了原来的目录结构呢
//就是利用了ZipEntry!!!
//在fileToZip()方法中就可以看到ZipEntry的使用!!
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipedFile));
if (willZipFileName.equals("*")) {
//若传入的是*表示将此路径下所有东西都要压缩
//所以调用dirToZip()
dirToZip(willZipDirAbsolutePath, wi