java 解压缩文件

2014-11-24 08:51:46 · 作者: · 浏览: 0
需要用到apache的ant.jar文件:
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import java.util.Enumeration;  
import org.apache.tools.zip.ZipEntry;  
import org.apache.tools.zip.ZipFile;  
import org.apache.tools.zip.ZipOutputStream;  
  
/** 
 * ZIP文件压缩和解压(要使用apache ant.jar以处理中文乱码) 
 * @author admin_Hzw 
 * 
 */  
@SuppressWarnings("unchecked")  
public class ZipUtil {  
  
    /** 
     * 压缩文件file成zip文件zipFile 
     *  
     * @param file 
     *            要压缩的文件 
     * @param zipFile 
     *            压缩文件存放地方 
     * @throws Exception 
     */  
    public static void zip(File file, File zipFile) throws Exception {  
        ZipOutputStream output = null;  
        try {  
            output = new ZipOutputStream(new FileOutputStream(zipFile));  
            // 顶层目录开始  
            zipFile(output, file, "");  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        } finally {  
            // 关闭流  
            if (output != null) {  
                output.flush();  
                output.close();  
            }  
        }  
    }  
  
    /** 
     * 压缩文件为zip格式 
     *  
     * @param output 
     *            ZipOutputStream对象 
     * @param file 
     *            要压缩的文件或文件夹 
     * @param basePath 
     *            条目根目录 
     * @throws IOException 
     */  
    private static void zipFile(ZipOutputStream output, File file,  
            String basePath) throws IOException {  
        FileInputStream input = null;  
        try {  
            // 文件为目录  
            if (file.isDirectory()) {  
                // 得到当前目录里面的文件列表  
                File list[] = file.listFiles();  
                basePath = basePath + (basePath.length() == 0   "" : "/")  
                + file.getName();  
                // 循环递归压缩每个文件  
                for (File f : list)  
                    zipFile(output, f, basePath);  
            } else {  
                // 压缩文件  
                basePath = (basePath.length() == 0   "" : basePath + "/")  
                + file.getName();  
                // System.out.println(basePath);  
                output.putNextEntry(new ZipEntry(basePath));  
                input = new FileInputStream(file);  
                int readLen = 0;  
                byte[] buffer = new byte[1024 * 8];  
                while ((readLen = input.read(buffer, 0, 1024 * 8)) != -1)  
                    output.write(buffer, 0, readLen);  
            }  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        } finally {  
            // 关闭流  
            if (input != null)  
                input.close();  
        }  
    }  
  
    /** 
     * 解压zip文件 
     *  
     * @param zipFilePath 
     *            zip文件绝对路径 
     * @param unzipDirectory 
     *            解压到的目录 
     * @throws Exception 
     */  
    public static void unzip(String zipFilePath, String unzipDirectory)  
    throws Exception {  
        // 定义输入输出流对象  
        InputStream input = null;  
        OutputStream output = null;  
        try {  
            // 创建文件对象  
            File file = new File(zipFilePath);  
            // 创建zip文件对象  
            ZipFile zipFile = new ZipFile(file);  
            File unzipFile = new File(unzipDirectory);  
            if (unzipFile.exists())    
                unzipFile.delete();  
            unzipFile.createNewFile();    
            // 得到zip文件条目枚举对象  
            Enumeration zipEnum = zipFile.getEntries();  
            // 定义对象  
            ZipEntry entry = null;  
            String entryName = null, path = null;  
            String names[] = null;  
            int length;  
            // 循环读取条目  
            while (zipEnum.hasMoreElements()) {  
                // 得到当前条目  
                entry = (ZipEntry) zipEnum.nextElement();  
                entryName = new String(entry.getName());  
                // 用/分隔条目名称  
                names = entryName.split("\\/");  
                length = names.length;  
                path = unzipFile.getAbsolutePath();  
                for (int v = 0; v < length; v++) {  
                    if (v < length - 1) // 最后一个目录之前的目录  
                        FileUtil.createDirectory(path += "/" + names[v] + "/");  
                    else { // 最后一个  
                        if (entryName.endsWith("/")) // 为目录,则创建文件夹  
                            FileUtil.createDirectory(unzipFile.getAbsolutePath()+ "/" + entryName);  
                        else { // 为文件,则输出到文件  
                            input = zipFile.getInputStream(entry);  
                            output = new FileOutputStream(new File(unzipFile  
                                    .getAbsolutePath()  
                                    + "/" + entryName));  
                            byte[] buffer = new byte[1024 * 8];  
                            int readLen = 0;  
                            while ((readLen = input.read(buffer, 0, 1024 * 8)) != -1)  
                                output.write(buffer, 0, readLen);  
                        }  
                    }  
                }  
            }  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        } finally {  
            // 关闭流  
            if (input != null)  
                input.close();  
            if (output != null) {  
                output.flush();  
                output.close();  
            }  
        }  
    }  
  
    public static void main(String[] args) throws Exception {  
        String path = "D:/temp/ipconfig";  //源文件路径  
        zip(new File(path+".txt"), new File(path+".zip"));  //压缩文件  
        unzip(path+".zip", "C://temp"); //解压        
    }  
}   

文件工具类:
import java.io.File;  
/** 
 * 文件工具类 
 * @author admin_Hzw 
 * 
 */  
public class FileUtil {  
    public static void createDirectory(String path) throws Exception{  
        File f = new File(path);  
        if(!f.exists()){  
            f.createNewFile();   
        }  
    }  
}