A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hejinzhong 中级黑马   /  2014-8-25 00:19  /  1170 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 hejinzhong 于 2014-8-25 06:17 编辑

自己测试多次,都使用正常,求指点bug,或逻辑错误。

  1. package iostream;
  2. /*
  3. * 一个压缩文件的过程,目前只试了不包括中文的目录,继续研究中文目录。
  4. */
  5. import java.io.*;
  6. import java.util.zip.*;

  7. public class Demo {

  8.         public static void main(String[] args) throws Exception {
  9.                 //指定压缩文件的源和目的
  10.                 File srcFile = new File("f://java");
  11.                 File destPath = new File(srcFile + ".zip");
  12.                 compress(srcFile, destPath);
  13.         }

  14.         private static void compress(File srcFile, File destPath) throws Exception {
  15.                 //这里运用算法检查,将压缩流先写入检测,再写入目标文件
  16.                 CheckedOutputStream cos = new CheckedOutputStream(new FileOutputStream(
  17.                                 destPath), new CRC32());
  18.                 ZipOutputStream zos = new ZipOutputStream(cos);
  19.                
  20.                 //目录之间有层次关系,基础目录为"";
  21.                 String basePath = "";
  22.                 compress(srcFile, zos, basePath);
  23.                 zos.finish();
  24.                 zos.close();

  25.         }

  26.         private static void compress(File srcFile, ZipOutputStream zos,
  27.                         String basePath) throws Exception {
  28.                 //判断压缩的是目录还文件
  29.                 if (srcFile.isDirectory()) {
  30.                         //如果是目录,测将基础目录加上该目录
  31.                         compressDir(srcFile, zos, basePath + srcFile.getName() + "/");
  32.                 } else {
  33.                         //文件,则进行压缩
  34.                         compressFile(srcFile, zos, basePath);
  35.                 }
  36.         }

  37.         private static void compressFile(File srcFile, ZipOutputStream zos,
  38.                         String basePath) throws Exception {
  39.                 //将写入流指向该文件
  40.                 ZipEntry entry = new ZipEntry(basePath + srcFile.getName());
  41.                 zos.putNextEntry(entry);
  42.                
  43.                 //利用字节缓冲流,读取文件中内容,写入压缩流中
  44.                 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
  45.                                 srcFile));
  46.                 byte[] buf = new byte[1024];
  47.                 int len = 0;
  48.                 while ((len = bis.read(buf)) != -1) {
  49.                         zos.write(buf, 0, len);
  50.                 }
  51.                 bis.close();
  52.                 zos.closeEntry();
  53.         }

  54.         private static void compressDir(File srcFile, ZipOutputStream zos,
  55.                         String basePath) throws Exception {
  56.                
  57.                 //列出目录中的所有文件
  58.                 File[] files = srcFile.listFiles();
  59.                
  60.                 //当目录中文件为空,则创建该目录,否则下面继续用递归判断目录中的文件
  61.                 if (files.length == 0) {
  62.                         ZipEntry entry = new ZipEntry(basePath);
  63.                         zos.putNextEntry(entry);
  64.                         zos.closeEntry();
  65.                 }
  66.                 //递归判断
  67.                 for (File file : files) {
  68.                         compress(file, zos, basePath);
  69.                 }
  70.         }
  71. }

复制代码



1 个回复

倒序浏览
make下,支持
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马