黑马程序员技术交流社区
标题:
<IO流>层级目录文件压缩过程详解!!
[打印本页]
作者:
hejinzhong
时间:
2014-8-25 00:19
标题:
<IO流>层级目录文件压缩过程详解!!
本帖最后由 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);
}
}
}
复制代码
作者:
496080891
时间:
2014-8-25 07:04
make下,支持
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2