Java文件的压缩与解压缩
文件的压缩与解压缩使我们平时经常会碰到的问题,Java对文件的压缩与解压缩支持的也非常好,主要用到的类有:
1、ZipInputStream:此类为读取 ZIP 文件格式的文件实现输入流过滤器。
2、ZipOutputStream:此类为以 ZIP 文件格式写入文件实现输出流过滤器。
3、ZipEntry:此类用于表示 ZIP 文件条目。
4、ZipFile:此类用于从 ZIP 文件读取条目。
下面就用两个具体的实例来展现文件的压缩与解压缩的操作步骤。
文件的压缩:
将文件压缩成zip格式的文件包,包括目录,具体包括以下步骤:
(1)、用压缩后文件名创建输出流
ZipOutputStream zout=new ZipOutputStream(new FileOutputStream(zipFileName));
BufferedOutputStream bufout=new BufferedOutputStream(zout);
(2)、检查被压缩文件是目录还是文件
如果是文件:
a、创建Zip压缩进入点:
zout.putNextEntry(new ZipEntry(“被压缩文件名”));
b、用被压缩文件名创建输入流
FileInputStream fin=new FileInputStream(f);
BufferedInputStream bufin=new BufferedInputStream(fin);
c、然后循环地从输入流读取内容,写入到输出流。
(3)、在适当的位置关闭所有流
下面请看示例代码:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
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 ZipCompressing {
private int k=1; // 定义递归次数变量
public static void main(String[] args) {
// TODO Auto-generated method stub
ZipCompressing book=new ZipCompressing();
try{
book.zip("E:\\娱乐\\JavaTest.zip", new File("E:\\娱乐\\JavaTest"));
}catch(Exception e){
e.printStackTrace();
}
}
private void zip(String zipFileName,File inputFile) throws IOException{
System.out.println("压缩中...");
ZipOutputStream zout=new ZipOutputStream(new FileOutputStream(zipFileName));
BufferedOutputStream bufout=new BufferedOutputStream(zout);
zip(zout, inputFile,inputFile.getName(),bufout);
bufout.close();
zout.close();
System.out.println("压缩完成");
}
private void zip(ZipOutputStream zout, File f, String base, BufferedOutputStream bufout) throws IOException {
// TODO Auto-generated method stub
if(f.isDirectory()){
File[] f1=f.listFiles();
if(f1.length==0){
zout.putNextEntry(new ZipEntry(base+"/")); // 创建Zip进入点base
System.out.println(base+"/");
}
for(int i=0;i<f1.length;i++){
zip(zout, f1[i],base+"/"+f1[i].getName(),bufout); // 递归遍历子文件
}
System.out.println("第"+k+"次递归");
k++;
}else {
zout.putNextEntry(new ZipEntry(base)); // 创建Zip压缩进入点base
System.out.println(base);
FileInputStream fin=new FileInputStream(f);
BufferedInputStream bufin=new BufferedInputStream(fin);
int b;
while((b=bufin.read())!=-1){
bufout.write(b); // 将字节流写入当前Zip目录
}
bufin.close();
fin.close();
}
}
}
文件的解压缩:
文件的解压缩过程就是从压缩文件中读取内容,然后按照压缩文件的组织结构写入到目的文件中。下面介绍具体操作步骤:
(1)、用被解压的Zip文件名创建输入流:
ZipInputStream zin=new ZipInputStream(new FileInputStream(dirFileName));
BufferedInputStream bufin=new BufferedInputStream(zin);
(2)、循环访问输入流,依次处理每一个条目:检查当前条目是否为为文件
如果为文件:
a、检查输出的目的文件是否存在,如果不存在则创建目录:
File fout=new File(parent,entry.getName());
(new File(fout.getParent())).mkdirs();
b、用输出的目的文件名创建输出流
FileOutputStream out=new FileOutputStream(fOut);
BufferedOutputStream bufout=new BufferedOutputStream(out);
c、循环地进行读与写。
(3)、在适当的位置关闭流。
下面请看示例代码:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/*
* 程序实现了ZIP解压[decompression]
*
*/
public class ZipDecrompressing {
public static void main(String[] args) {
// TODO Auto-generated method stub
long startTime=System.currentTimeMillis();
File parent=new File("E:\\娱乐\\JavaTest1"); // 输出路径(文件夹目录)
String dirFileName="E:\\娱乐\\JavaTest.zip"; // 输入源Zip路径
try {
// 读
ZipInputStream zin=new ZipInputStream(new FileInputStream(dirFileName)); // 输入源Zip路径
BufferedInputStream bufin=new BufferedInputStream(zin);
File fOut=null;
ZipEntry entry=null;
try {
while((entry=zin.getNextEntry())!=null&&!entry.isDirectory()){
fOut=new File(parent,entry.getName());
if(!fOut.exists()){
(new File(fOut.getParent())).mkdirs();
}
FileOutputStream out=new FileOutputStream(fOut);
BufferedOutputStream bufout=new BufferedOutputStream(out);
int b;
while((b=bufin.read())!=-1){
bufout.write(b);
}
bufout.close();
out.close();
System.out.println(fOut+"解压成功");
}
} catch (Exception e1) {
e1.printStackTrace();
}finally {
bufin.close();
zin.close();
}
}catch(Exception e){
e.printStackTrace();
}
long endTime=System.currentTimeMillis();
System.out.println("耗费时间: "+(endTime-startTime)+" ms");
}
}