加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

JAVA 实现 ZIP压缩

(2015-02-06 13:54:10)
标签:

java

zip压缩

javazip

java压缩

zipoutputstream

分类: 我的IT

年底了,心情不免浮躁,今天抽出了一个ZIP文件压缩功能,本地试验了下很强大,在这里分享一下:

很简单一个工具类 一个测试类

工具类Utils代码如下 

 

package com.tyzs.util;

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.ZipOutputStream;

public class Utils {
 
 public static void zipFile(String baseDirName, String fileName,
   String targetFileName) {
  File baseDir = new File(baseDirName);// 获得根目录 File
  // 判断此目录是否存在 此目录是否是一个文件类型的目录
  if (!baseDir.exists() || (!baseDir.isDirectory())) {
   return;
  }
  String baseDirPath = baseDir.getAbsolutePath(); // 返回此路径的绝对路径名
  // 目标文件
  File targetFile = new File(targetFileName);
  try {
   // 创建一个ZIP输出流来压缩数据并写入到ZIP文件
   ZipOutputStream out = new ZipOutputStream(new FileOutputStream(targetFile));
   if (fileName.equals("*")) {
    // 将baseDir目录下的所有文件压缩到ZIP
    dirToZip(baseDirPath, baseDir, out);
   } else {
    File file = new File(baseDir, fileName);
    if (file.isFile()) {
     fileToZip(baseDirPath, file, out);
    } else {
     dirToZip(baseDirPath, file, out);
    }
   }
   out.close();
   System.out.println("压缩文件成功,目标文件名:" + targetFileName);
  } catch (Exception e) {
   System.out.println("压缩失败:" + e);
   e.printStackTrace();
  }
 }

 
 private static void dirToZip(String baseDirPath, File dir,
   ZipOutputStream out) {
  if (dir.isDirectory()) {
   // 列出DIR目录下所有文件
   File[] files = dir.listFiles();
   // 如果是空文件夹
   if (files.length == 0) {
    ZipEntry entry = new ZipEntry(getEntryName(baseDirPath, dir));
    // 存储目录信息
    try {
     out.putNextEntry(entry);
     out.closeEntry();
    } catch (IOException e) {
     e.printStackTrace();
    }
    return;
   }
   for (int i = 0; i < files.length; i++) {
    if (files[i].isFile()) {
     // 如果是文件,调用fileToZip方法
     fileToZip(baseDirPath, files[i], out);
    } else {
     // 如果是目录,递归调用
     dirToZip(baseDirPath, files[i], out);
    }
   }
  }
 }

 
 private static void fileToZip(String baseDirPath, File file,
   ZipOutputStream out) {
  FileInputStream in = null;
  ZipEntry entry = null;
  // 创建复制缓冲区
  byte[] buffer = new byte[4096];
  int bytes_read;
  if (file.isFile()) {
   try {
    // 创建一个文件输入流
    in = new FileInputStream(file);
    // 做一个ZipEntry
    entry = new ZipEntry(getEntryName(baseDirPath, file));
    // 存储项信息到压缩文件
    out.putNextEntry(entry);
    // 复制字节到压缩文件
    while ((bytes_read = in.read(buffer)) != -1) {
     out.write(buffer, 0, bytes_read);
    }
    out.closeEntry();
    in.close();
    System.out.println("添加文件" + file.getAbsolutePath()
      + "被到ZIP文件中!");
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }

 
 private static String getEntryName(String baseDirPath, File file) {
  if (!baseDirPath.endsWith(File.separator)) {
   baseDirPath += File.separator;
  }
  String filePath = file.getAbsolutePath();
  // 对于目录,必须在entry名字后面加上"/",表示它将以目录项存储。
  if (file.isDirectory()) {
   filePath += "/";
  }
  int index = filePath.indexOf(baseDirPath);
  return filePath.substring(index + baseDirPath.length());
 }

}

本地测试类TEST:

package com.tyzs;

import com.tyzs.util.Utils;

public class RunMain {
 public static void main(String[] args) {
  String baseDirName="D:/";//根目录
  String fileName="test"; //根目录下的文件夹  如果为*刚表示  压缩 根目录 下的所有文件
  String targetFileName="D:/test.zip"; //目标路径
  
  Utils.zipFile(baseDirName, fileName, targetFileName);
 }
}
 

 

效果如下图:

http://s11/mw690/002Ff7YUgy6PLprKA4y0a&690实现 ZIP压缩" TITLE="JAVA 实现 ZIP压缩" />

 

查看压缩后的文件:  如果是LINUX 请注意下生产目录

http://s7/mw690/002Ff7YUgy6PLprUNRcb6&690实现 ZIP压缩" TITLE="JAVA 实现 ZIP压缩" />

 

最后,新年快乐!!!
                                                                                                                           抟摇直上 2015-02-06

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有