当前位置:编程学习 > JAVA >>

Java文件压缩与解压缩(二)

[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 并不是说我们执行一句File f=new File("F:\\x.txt");  
//  在本地硬盘上就生成了一个x.txt文件.而应该进行如下的  
//  操作才可以.  
//  File f=new File("F:\\x.txt");  
//  if (!f.exists()) {  
//     f.createNewFile();  
//  }  www.zzzyk.com
// 其中f.createNewFile()表示创建了一个空文件  
//  www.zzzyk.com
// 多数的情况下,我们执行了File f=new File("F:\\x.txt")  
// 以后再利用输入流,输出流对f进行操作,比如往该x.txt文件中  
// 写入hello world  
//   
  
//3 血的教训:  
//  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("F:\\", "kk\\cc.txt", "F:\\cc1.zip");  
       //将某一个zip解压  
       test.unZipFile("F:\\cc1.zip", "F:\\zzzz");  
   }  
     
/** 
 * @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, willZipDir, zos);  
            } else {  
                //将被压缩的文件  
                File willZipFile = new File(willZipDirPath, willZipFileName);  
                  
                if (willZipFile.isFile()) {  
                    System.out.println("…………………最外层开始压缩文件………………………");  
                    fileToZip(willZipDirPath, willZipFile, zos);  
                    System.out.println("…………………最外层压缩文件结束………………………");  
                }  
                if (willZipFile.isDirectory()) {  
                    System.out.println("…………………最外层开始压缩目录………………………");  
                    dirToZip(willZipDirPath, willZipFile, zos);  
                    System.out.println("…………………最外层压缩目录结束…………&h
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,