java 将文件夹压缩为zip压缩文件

还记得压缩文件是我刚入职时,师傅让我完成的案例,当时把我愁的哦。刚才用到,才发现忘得差不多了。哎,都是不长回头惹的祸啊。回头看了下 在这里记录下。方便自己也方便了他人么,不足地方请各位指出呢!

其实压缩文件并不是太难,在这里主要就是对IO流、ZIP的运用,挺有意思的一个案例。

现在对过程捋一下哈

首先,压缩文件要清楚需要用到的各种流,其次 要对文件夹和文件进行分类处理,在这里想对来说文件夹是相对来说较难的一个(因为用到回调函数,这点对于新手来说可能不是太容易想到,感觉好神奇),两者之间共性就是都要先创建一个以文件目录为名的zip压缩文件,然后将数据写入到新建的zip中,完成文件的压缩。

个人认为真正的难点,在于理清楚FileOutputStream、ZipOutputStream和BufferedOutputStream三者之间的关系,这点尤其重要(这点 我在代码中有注释解释,希望认真看 搞清逻辑)。  好了,废话不多说,直接上码,毕竟代码才是实打实的麽

压缩文件代码:(包含抛出的异常)

package com.tpad.compress;


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
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;

import javax.swing.JOptionPane;

class ZipCompress {
private String zipFileName;
private String sourceFileName;

public ZipCompress(String zipFileName, String sourceFileName) {
this.zipFileName = zipFileName;
this.sourceFileName = sourceFileName;
}

public void zip() throws MyZipException, IOException {

System.out.println("压缩中...");

ZipOutputStream out = null;
BufferedOutputStream bos = null;
File sourceFile = null;
try {
out = new ZipOutputStream(new FileOutputStream(zipFileName)); // 创建一个zip输出流
bos = new BufferedOutputStream(out); // 创建一个新的缓冲输出流,以将数据写入指定的位置
sourceFile = new File(sourceFileName);

compress(out, bos, sourceFile, sourceFile.getName());
} catch (MyZipException e) {
// TODO: handle exception
throw new MyZipException(e.getMessage());
} finally {
closeT(out);
closeT(bos);
}
System.out.println("压缩完成");
}

private void closeT(Closeable c) {
// TODO Auto-generated method stubsss
// 为防止内存泄漏以及代码优化,写了一个关闭流的方法
// 流 不为空时,关闭
if (c != null) {
try {
c.close();
} catch (IOException e) {
// TODO: handle exception
}
}
}

public void compress(ZipOutputStream out, BufferedOutputStream bos, File sourceFile, String base)
throws MyZipException {
BufferedInputStream bis = null;
try {
if (sourceFile.isDirectory()) {

File[] flist = sourceFile.listFiles(); // 获取文件目录内文件个数

if (flist.length == 0) {
System.out.println(base + "/");
// 空的文件条目
// putNextEntry:开始编写新的ZIP文件条目,并将流定位到ZIP文件开头
// ZipEntry:创建具有指定名称的新ZIP条目(建立一个以base为名的zip压缩文件)
out.putNextEntry(new ZipEntry(base + "/")); // 创建压缩的子目录
} else {
for (int i = 0; i < flist.length; i++) {
// 如果文件夹下还有文件的话,使用回调函数对下一层进行处理
compress(out, bos, flist[i], base + "/" + flist[i].getName());
}
}
} else {
// 不是文件目录(文件)

out.putNextEntry(new ZipEntry(base)); // 创建以base为名的zip压缩文件
// 创建缓冲输入流
bis = new BufferedInputStream(new FileInputStream(sourceFile));
int len = 0; // 记录要写入的字节数
byte[] by = new byte[1024 * 5]; // 记录读取的数据
System.out.println(base);

while ((len = bis.read(by)) != -1) {
bos.write(by, 0, len); // 将数据写入
}
closeT(bis);// 关闭流
}
} catch (IOException e) {
// TODO: handle exception
throw new MyZipException(e.getMessage());
}
}
}

public class CompressDemo {

public static void main(String[] args) throws MyZipException, IOException {
ZipCompress zipCom = null;
try {
zipCom = new ZipCompress("d:\\faaa.zip", "d:\\faaa\\");
zipCom.zip();
JOptionPane.showMessageDialog(null, "ok");
} catch (MyZipException e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
}
}

下面是本人写的异常:(仅供参考)

package com.tpad.compress;

@SuppressWarnings("serial")
public class MyZipException extends Exception {

public MyZipException(){
super();
}

public MyZipException(String str){
super(str);
}
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值