您的位置:首页 > 编程语言 > Java开发

JAVA实现实用的ZIP压缩与解压

2017-04-16 22:30 429 查看
程序实现了ZIP压缩。共分为2部分 : 压缩(compression)与解压(decompression)
大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。 需在代码中自定义源输入路径和目标输出路径。

import java.io.*;  
    import java.util.zip.*;  
      
    /** 
     * 程序实现了ZIP压缩。共分为2部分 : 压缩(compression)与解压(decompression) 
     * <p> 
     * 大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。
     * 需在代码中自定义源输入路径和目标输出路径。 
     * <p> 
     * 在本段代码中,实现的是压缩部分;解压部分见本包中Decompression部分。 
     *  
     * @author HAN 
     *  
     */  
      
    public class MyZipCompressing {  
        private int k = 1; // 定义递归次数变量  
      
        public MyZipCompressing() {  
            // TODO Auto-generated constructor stub  
        }  
      
        /** 
         * @param args 
         */  
        public static void main(String[] args) {  
            // TODO Auto-generated method stub  
            MyZipCompressing book = new MyZipCompressing();  
            try {  
                book.zip("C:\\Users\\Gaowen\\Desktop\\ZipTestCompressing.zip",  
                        new File("C:\\Users\\Gaowen\\Documents\\Tencent Files"));  
            } catch (Exception e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
      
        }  
      
        private void zip(String zipFileName, File inputFile) throws Exception {  
            System.out.println("压缩中...");  
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(  
                    zipFileName));  
            BufferedOutputStream bo = new BufferedOutputStream(out);  
            zip(out, inputFile, inputFile.getName(), bo);  
            bo.close();  
            out.close(); // 输出流关闭  
            System.out.println("压缩完成");  
        }  
      
        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  
                    System.out.println(base + "/");  
                }  
                for (int i = 0; i < fl.length; i++) {  
                    zip(out, fl[i], base + "/" + fl[i].getName(), bo); // 递归遍历子文件夹  
                }  
                System.out.println("第" + k + "次递归");  
                k++;  
            } else {  
                out.putNextEntry(new ZipEntry(base)); // 创建zip压缩进入点base  
                System.out.println(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(); // 输入流关闭  
            }  
        }  
    }


import java.io.*;
import java.util.zip.*;
/**
* 程序实现了ZIP压缩。共分为2部分 :
* 压缩(compression)与解压(decompression)
* <p>
* 大致功能包括用了多态,递归等JAVA核心技术,可以对单个文件和任意级联文件夹进行压缩和解压。
* 需在代码中自定义源输入路径和目标输出路径。
* <p>
* 在本段代码中,实现的是解压部分;压缩部分见本包中compression部分。
* @author HAN
*
*/
public class CopyOfMyzipDecompressing {

public static void main(String[] args) {
// TODO Auto-generated method stub
long startTime=System.currentTimeMillis();
try {
ZipInputStream Zin=new ZipInputStream(new FileInputStream(
"C:\\Users\\HAN\\Desktop\\stock\\SpectreCompressed.zip"));//输入源zip路径
BufferedInputStream Bin=new BufferedInputStream(Zin);
String Parent="C:\\Users\\HAN\\Desktop"; //输出路径(文件夹目录)
File Fout=null;
ZipEntry entry;
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 Bout=new BufferedOutputStream(out);
int b;
while((b=Bin.read())!=-1){
Bout.write(b);
}
Bout.close();
out.close();
System.out.println(Fout+"解压成功");
}
Bin.close();
Zin.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long endTime=System.currentTimeMillis();
System.out.println("耗费时间: "+(endTime-startTime)+" ms");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: