java中对文件解压和压缩的实现

今天早上写的,里面需要用到ant,jar这个包,需要的可以自己下。O(∩_∩)O哈哈~

ZipUtil.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以处理中文乱码)
 * 
 */
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..............");
 }

}

FileUtil.java

import java.io.File;
import java.io.FileNotFoundException;


public class FileUtil {
	 /** 
     * 创建文件夹,如果文件夹存在则不进行创建。 
     * @param path 
     * @throws Exception  
     */  
    public static void createDirectory(String path) throws Exception{  
        path = separatorReplace(path);  
        File folder = new File(path);  
        if(folder.isDirectory()){  
            return;  
        }else if(folder.isFile()){  
            deleteFile(path);  
        }  
        folder.mkdirs();  
    }  
    
    /**
     * 分隔符替换
     * window下测试通过
     * @param path
     * @return
     */
    public static String separatorReplace(String path){
    	return path.replace("\\","/");
    }
    
    /**
     * 根据文件路径删除文件,如果路径指向的文件不存在或删除失败则抛出异常。
     * @param path
     * @return
     * @throws Exception 
     */
    public static void deleteFile(String path) throws Exception {
    	path = separatorReplace(path);
        File file = getFile(path);    
        if(!file.delete()){
        	throw new Exception("delete file failure");
        }                      
    }
    
    /**
	 * 通过路径获得文件,
	 * 若不存在则抛异常,
	 * 若存在则返回该文件。
	 * @param path
	 * @return
	 * @throws FileNotFoundException
	 */
	public static File getFile(String path) throws FileNotFoundException{
		path = separatorReplace(path);				
		File file = new File(path);
		if(!file.isFile()){
			throw new FileNotFoundException("file not found!");
		}
		return file;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值