java文件压缩

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();
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值