一 概述1.目录进入点目录进入点是文件在压缩文件中的映射,代表压缩文件。压缩文件时,创建目录进入点,将文件写入该目录进入点。解压时,获取目录进入点,将该目录进入点的内容写入硬盘指定文件。
如果目录进入点是一个文件夹,在命名时必须以路径分隔符结尾,在window操作系统中名称分隔符为“/”。
2.文件的自动创建无论是调用createnewfile()创建文件,还是在创建输出流时由输出流负责创建文件,都必须保证父路径已经存在,否则文件无法创建。
3.目录的创建mkdirs():创建多级目录。
mkdir():创建一级目录,如果父路径不存在,创建失败。
二 压缩1.创建目录进入点首先为文件或者文件夹创建目录进入点,目录进入点的名称为当前文件相对于压缩文件的路径,文件夹的目录进入点名称必须以名称分隔符结尾,以区别于文件。
zipentry entry = new zipentry(压缩文件夹名称 + file.separator+文件或文件夹路径);
2.写入目录进入点使用zipoutputstream输出流将文件写入对应目录进入点中,写入完成,关闭目录进入点。
3.demopackage com.javase.io;import java.io.file;import java.io.fileinputstream;import java.io.fileoutputstream;import java.io.ioexception;import java.util.zip.zipentry;import java.util.zip.zipinputstream;import java.util.zip.zipoutputstream;public class ziputils {/** * 压缩一个文件夹
     * 
     * @throws ioexception     */public void zipdirectory(string path) throws ioexception {
        file file = new file(path);
        string parent = file.getparent();
        file zipfile = new file(parent, file.getname() + .zip);
        zipoutputstream zos = new zipoutputstream(new fileoutputstream(zipfile));
        zip(zos, file, file.getname());
        zos.flush();
        zos.close();
    }/** * 
     * @param zos
     *            压缩输出流
     * @param file
     *            当前需要压缩的文件
     * @param path
     *            当前文件相对于压缩文件夹的路径
     * @throws ioexception     */private void zip(zipoutputstream zos, file file, string path) throws ioexception {// 首先判断是文件,还是文件夹,文件直接写入目录进入点,文件夹则遍历if (file.isdirectory()) {
            zipentry entry = new zipentry(path + file.separator);// 文件夹的目录进入点必须以名称分隔符结尾            zos.putnextentry(entry);
            file[] files = file.listfiles();for (file x : files) {
                zip(zos, x, path + file.separator + x.getname());
            }
        } else {
            fileinputstream fis = new fileinputstream(file);// 目录进入点的名字是文件在压缩文件中的路径zipentry entry = new zipentry(path);
            zos.putnextentry(entry);// 建立一个目录进入点int len = 0;byte[] buf = new byte[1024];while ((len = fis.read(buf)) != -1) {
                zos.write(buf, 0, len);
            }
            zos.flush();
            fis.close();
            zos.closeentry();// 关闭当前目录进入点,将输入流移动下一个目录进入点        }
    }}
三 解压文件1.基本思路解压文件时,先获取压缩文件中的目录进入点,根据该目录进入点创建文件对象,将目录进入点的内容写入硬盘文件中。
2.demopackage com.javase.io;import java.io.file;import java.io.fileinputstream;import java.io.fileoutputstream;import java.io.ioexception;import java.util.zip.zipentry;import java.util.zip.zipinputstream;import java.util.zip.zipoutputstream;public class ziputils {private string basepath;/** * 解压文件
     * 
     * @param unzip
     * @throws ioexception     */public void unzip(string unzip) throws ioexception {
        file file = new file(unzip);
        basepath = file.getparent();
        fileinputstream fis = new fileinputstream(file);
        zipinputstream zis = new zipinputstream(fis);
        unzip(zis);
    }private void unzip(zipinputstream zis) throws ioexception {
        zipentry entry = zis.getnextentry();if (entry != null) {
            file file = new file(basepath + file.separator + entry.getname());if (file.isdirectory()) {// 可能存在空文件夹if (!file.exists())
                    file.mkdirs();
                unzip(zis);
            } else {
                file parentfile = file.getparentfile();if (parentfile != null && !parentfile.exists())
                    parentfile.mkdirs();
                fileoutputstream fos = new fileoutputstream(file);// 输出流创建文件时必须保证父路径存在int len = 0;byte[] buf = new byte[1024];while ((len = zis.read(buf)) != -1) {
                    fos.write(buf, 0, len);
                }
                fos.flush();
                fos.close();
                zis.closeentry();
                unzip(zis);
            }
        }
    }
}
程序实现了zip压缩。共分为2部分 : 压缩(compression)与解压(decompression)
大致功能包括用了多态,递归等java核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源输入路径和目标输出路径。 
package com.han;    
import java.io.*;  
import java.util.zip.*;  
  
/** 
 * 程序实现了zip压缩。共分为2部分 : 压缩(compression)与解压(decompression) 
 * <p> 
 * 大致功能包括用了多态,递归等java核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源输入路径和目标输出路径。 
 * <p> 
 * 在本段代码中,实现的是压缩部分;解压部分见本包中decompression部分。 
 *  
 * @author han 
 *  
 */  
  
public class myzipcompressing {  
    private int k = 1; // 定义递归次数变量  
  
    public myzipcompressing() {  
        // todo auto-generated constructor stub  
    }  
  
    /** 
     * @param args 
     */  
    public static void main(string[] args) {  
        // todo auto-generated method stub  
        myzipcompressing book = new myzipcompressing();  
        try {  
            book.zip("c:\\users\\gaowen\\desktop\\ziptestcompressing.zip",  
                    new file("c:\\users\\gaowen\\documents\\tencent files"));  
        } catch (exception e) {  
            // todo auto-generated catch block  
            e.printstacktrace();  
        }  
  
    }  
  
    private void zip(string zipfilename, file inputfile) throws exception {  
        system.out.println("压缩中...");  
        zipoutputstream out = new zipoutputstream(new fileoutputstream(  
                zipfilename));  
        bufferedoutputstream bo = new bufferedoutputstream(out);  
        zip(out, inputfile, inputfile.getname(), bo);  
        bo.close();  
        out.close(); // 输出流关闭  
        system.out.println("压缩完成");  
    }  
  
    private void zip(zipoutputstream out, file f, string base,  
            bufferedoutputstream bo) throws exception { // 方法重载  
        if (f.isdirectory()) {  
            file[] fl = f.listfiles();  
            if (fl.length == 0) {  
                out.putnextentry(new zipentry(base + "/")); // 创建zip压缩进入点base  
                system.out.println(base + "/");  
            }  
            for (int i = 0; i < fl.length; i++) {  
                zip(out, fl[i], base + "/" + fl[i].getname(), bo); // 递归遍历子文件夹  
            }  
            system.out.println("第" + k + "次递归");  
            k++;  
        } else {  
            out.putnextentry(new zipentry(base)); // 创建zip压缩进入点base  
            system.out.println(base);  
            fileinputstream in = new fileinputstream(f);  
            bufferedinputstream bi = new bufferedinputstream(in);  
            int b;  
            while ((b = bi.read()) != -1) {  
                bo.write(b); // 将字节流写入当前zip目录  
            }  
            bi.close();  
            in.close(); // 输入流关闭  
        }  
    }  
}
package com.han;  
  
import java.io.*;  
import java.util.zip.*;  
/** 
 * 程序实现了zip压缩。共分为2部分 : 
 * 压缩(compression)与解压(decompression) 
 * <p> 
 * 大致功能包括用了多态,递归等java核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 
 * 需在代码中自定义源输入路径和目标输出路径。 
 * <p> 
 * 在本段代码中,实现的是解压部分;压缩部分见本包中compression部分。 
 * @author han 
 * 
 */  
public class copyofmyzipdecompressing {  
      
    public static void main(string[] args) {  
        // todo auto-generated method stub  
        long starttime=system.currenttimemillis();  
        try {  
            zipinputstream zin=new zipinputstream(new fileinputstream(  
                    "c:\\users\\han\\desktop\\stock\\spectrecompressed.zip"));//输入源zip路径  
            bufferedinputstream bin=new bufferedinputstream(zin);  
            string parent="c:\\users\\han\\desktop"; //输出路径(文件夹目录)  
            file fout=null;  
            zipentry entry;  
            try {  
                while((entry = zin.getnextentry())!=null && !entry.isdirectory()){  
                    fout=new file(parent,entry.getname());  
                    if(!fout.exists()){  
                        (new file(fout.getparent())).mkdirs();  
                    }  
                    fileoutputstream out=new fileoutputstream(fout);  
                    bufferedoutputstream bout=new bufferedoutputstream(out);  
                    int b;  
                    while((b=bin.read())!=-1){  
                        bout.write(b);  
                    }  
                    bout.close();  
                    out.close();  
                    system.out.println(fout+"解压成功");      
                }  
                bin.close();  
                zin.close();  
            } catch (ioexception e) {  
                // todo auto-generated catch block  
                e.printstacktrace();  
            }  
        } catch (filenotfoundexception e) {  
            // todo auto-generated catch block  
            e.printstacktrace();  
        }  
        long endtime=system.currenttimemillis();  
        system.out.println("耗费时间: "+(endtime-starttime)+" ms");  
    }  
  
}
以上就是java对文件的压缩与解压的详细内容。
   
 
   