1. 用Gzip进行单个文件简单压缩。
使用GZIPInputStream和GZIPOutputStream读取和生成压缩文件。
import java.util.zip.*;
import java.io.*;
public class GZIPcompress {
<span style="white-space:pre"> </span>public static void main(String[] args)throws Exception{
if(args.length==0) {
System.exit(1);
}
//用Gzip压缩文件
BufferedReader in=new BufferedReader(
new FileReader(args[0]));
BufferedOutputStream out=new BufferedOutputStream(
new GZIPOutputStream(new FileOutputStream("test.gz")));
int c;
while((c=in.read())!=-1)
out.write(c);
in.close();
out.close();
//得到压缩文件的内容并输出
BufferedReader in2=new BufferedReader(
new InputStreamReader(new GZIPInputStream(
new FileInputStream("test.gz"))));
String s;
while((s=in2.readLine()) != null)
System.out.println(s);
<span style="white-space:pre"> </span>}
}
2. 使用Zip进行多个文件压缩
使用ZipInputStream和ZipOutputStream读取和生成压缩文件。
对于每一个要压缩的文件,要使用putNextEntry(),向其中传递一个ZipEntry对象new ZipEntry(fileName)。
解压缩文件时,使用ZipInputStream的getNextEntry()方法返回下一个ZipEntry,或者使用ZipFile读取文件,entries()方法返回一个ZipEntry的枚举。
import java.util.zip.*;
import java.util.*;
import java.io.*;
public class ZipCompress {
public static void main(String[] args) throws IOException {
ZipOutputStream zos=new ZipOutputStream(
new CheckedOutputStream(
new FileOutputStream("test.zip"),new Adler32()));
BufferedOutputStream out=new BufferedOutputStream(zos);
//遍历压缩每个文件
for(String arg : args) {
BufferedReader in=new BufferedReader(
new FileReader(arg));
//在ZipOutputStream中放入一个ZipEntry
zos.putNextEntry(new ZipEntry(arg));
int c;
while((c=in.read())!=-1) {
out.write(c);
}
in.close();
out.flush();
}
out.close();
//读取压缩文件
ZipInputStream zis=new ZipInputStream(
new CheckedInputStream(
new FileInputStream("test.zip"),new Adler32()));
BufferedInputStream bis=new BufferedInputStream(zis);
ZipEntry obj;
while((obj=zis.getNextEntry())!=null) {
int x;
while((x=bis.read())!=-1) {
System.out.print((char)x);
}
}
bis.close();
ZipFile zf=new ZipFile("test.zip");
Enumeration e=zf.entries();
while(e.hasMoreElements()) {
ZipEntry entry=(ZipEntry)e.nextElement();
//...提取Zip中的数据
}
}
}
3. 使用Zip压缩文件夹内的所有文件。
压缩文件夹时需要压缩文件夹内的所有文件,zos.putNextEntry(new ZipEntry(fileName))传入的fileName是压缩文件的完整目录结构。关键代码如下:
private void zip(String zipFileName, File inputFile) throws Exception {
<span style="white-space:pre"> </span>zip(out, inputFile, inputFile.getName(), bo);
}
private void zip(ZipOutputStream out, File f, String base, BufferedOutputStream bo) throws Exception { // 方法重载
if (f.isDirectory()) {
File[] fl = f.listFiles();
//空文件夹
if (fl.length == 0) {
out.putNextEntry(new ZipEntry(base + "/")); // 创建zip压缩进入点base
}
else {
for (int i = 0; i < fl.length; i++)
zip(out, fl[i], base + "/" + fl[i].getName(), bo); // 递归遍历子文件夹
}
}
else {
out.putNextEntry(new ZipEntry(base)); // 创建zip压缩进入点base
FileInputStream in = new FileInputStream(f);
BufferedInputStream bi = new BufferedInputStream(in);
int b;
while ((b = bi.read()) != -1) {
bo.write(b); // 将字节流写入当前zip目录
}
bi.close();
in.close(); // 输入流关闭
}
}
解压缩文件时,如果目标文件夹不存在,需要创建文件夹mkdir(),关键代码如下:
private void unZip(String zipFileName, String outputPath) throws Exception {
ZipInputStream zin=new ZipInputStream(new FileInputStream(zipFileName));//输入源zip路径
BufferedInputStream bin=new BufferedInputStream(zin);
//outputPath="C:\\"; //输出路径
while((entry = zin.getNextEntry())!=null && !entry.isDirectory()){
Fout=new File(outputPath,entry.getName());
if(!Fout.exists()){
(new File(Fout.getParent())).mkdirs();
}
BufferedOutputStream bout=new BufferedOutputStream(
new FileOutputStream(Fout));
int b;
while((b=bin.read())!=-1){
bout.write(b);
}
bout.close();
}
bin.close();
zin.close();
}