本帖最后由 hejinzhong 于 2014-8-25 06:17 编辑
自己测试多次,都使用正常,求指点bug,或逻辑错误。
- package iostream;
- /*
- * 一个压缩文件的过程,目前只试了不包括中文的目录,继续研究中文目录。
- */
- import java.io.*;
- import java.util.zip.*;
- public class Demo {
- public static void main(String[] args) throws Exception {
- //指定压缩文件的源和目的
- File srcFile = new File("f://java");
- File destPath = new File(srcFile + ".zip");
- compress(srcFile, destPath);
- }
- private static void compress(File srcFile, File destPath) throws Exception {
- //这里运用算法检查,将压缩流先写入检测,再写入目标文件
- CheckedOutputStream cos = new CheckedOutputStream(new FileOutputStream(
- destPath), new CRC32());
- ZipOutputStream zos = new ZipOutputStream(cos);
-
- //目录之间有层次关系,基础目录为"";
- String basePath = "";
- compress(srcFile, zos, basePath);
- zos.finish();
- zos.close();
- }
- private static void compress(File srcFile, ZipOutputStream zos,
- String basePath) throws Exception {
- //判断压缩的是目录还文件
- if (srcFile.isDirectory()) {
- //如果是目录,测将基础目录加上该目录
- compressDir(srcFile, zos, basePath + srcFile.getName() + "/");
- } else {
- //文件,则进行压缩
- compressFile(srcFile, zos, basePath);
- }
- }
- private static void compressFile(File srcFile, ZipOutputStream zos,
- String basePath) throws Exception {
- //将写入流指向该文件
- ZipEntry entry = new ZipEntry(basePath + srcFile.getName());
- zos.putNextEntry(entry);
-
- //利用字节缓冲流,读取文件中内容,写入压缩流中
- BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
- srcFile));
- byte[] buf = new byte[1024];
- int len = 0;
- while ((len = bis.read(buf)) != -1) {
- zos.write(buf, 0, len);
- }
- bis.close();
- zos.closeEntry();
- }
- private static void compressDir(File srcFile, ZipOutputStream zos,
- String basePath) throws Exception {
-
- //列出目录中的所有文件
- File[] files = srcFile.listFiles();
-
- //当目录中文件为空,则创建该目录,否则下面继续用递归判断目录中的文件
- if (files.length == 0) {
- ZipEntry entry = new ZipEntry(basePath);
- zos.putNextEntry(entry);
- zos.closeEntry();
- }
- //递归判断
- for (File file : files) {
- compress(file, zos, basePath);
- }
- }
- }
复制代码
|
|