java 压缩解压文件详解编程语言

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 sunjun 
 * @version 2.0 
 */ 
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); 
   // 创建本zip文件解压目录 
   String name = file.getName().substring(0, 
     file.getName().lastIndexOf(".")); 
   File unzipFile = new File(unzipDirectory + "/" + name); 
   if (unzipFile.exists()) 
    unzipFile.delete(); 
   unzipFile.mkdir(); 
   // 得到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(); 
   } 
  } 
 } 
 
 /** 
  * 测试 
  *  
  * @param args 
  * @throws Exception 
  */ 
 public static void main(String[] args) throws Exception { 
  unzip("d:/桌面.zip", "f:/"); 
  System.out.println("over...................."); 
  zip(new File("C:/a"), new File("d:/桌面.zip")); 
  System.out.println("over.............."); 
 } 
 
}

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/10913.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论