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

java压缩和解压缩Zip、Jar、Gzip文件

2015-06-21 22:50 691 查看
我们经常会使用WinZIP等压缩软件将文件进行压缩以方便传输。在java里面也提供了将文件进行压缩以减少传输时的数据量的类,可以很方便的将文件压缩成ZIP、JAR、GZIP等形式,GZIP主要是在Linux系统下的压缩文件。

下面主要讲的就是ZIP形式的压缩文件,而JAR、GZIP形式的压缩文件也是类似的用法。

ZIP是一种很常见的压缩形式,在java中要实现ZIP的压缩主要用到的是java.util.zip这个包里面的类。主要有ZipFile、ZipOutputStream、ZipInputStream和ZipEntry。ZipOutputStream是用来压缩文件的,ZipInputStream和ZipFile是用来解压缩文件的,在压缩和解压缩的过程中,ZipEntry都会用到。在java的Zip压缩文件中,每一个子文件都是一个ZipEntry对象。

 

压缩文件:

 

Java代码  


import java.io.File;  

import java.io.FileInputStream;  

import java.io.FileOutputStream;  

import java.io.IOException;  

import java.io.InputStream;  

import java.nio.charset.Charset;  

import java.util.zip.ZipEntry;  

import java.util.zip.ZipOutputStream;  

  

public class ZipOutputStreamTest {  

  

    public static void main(String args[]) throws IOException {  

        test1();  

        test2();  

    }  

      

    public static void test1() throws IOException {  

        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("D:\\testZip.zip"), Charset.forName("GBK"));  

        //实例化一个名称为ab.txt的ZipEntry对象  

        ZipEntry entry = new ZipEntry("ab.txt");  

        //设置注释  

        zos.setComment("zip测试for单个文件");  

        //把生成的ZipEntry对象加入到压缩文件中,而之后往压缩文件中写入的内容都会放在这个ZipEntry对象里面  

        zos.putNextEntry(entry);  

        InputStream is = new FileInputStream("D:\\ab.txt");  

        int len = 0;  

        while ((len = is.read()) != -1)  

            zos.write(len);  

        is.close();  

        zos.close();  

    }  

      

    public static void test2() throws IOException {  

        File inFile = new File("D:\\test");  

        ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("D:\\test.zip"), Charset.forName("GBK"));  

        zos.setComment("多文件处理");  

        zipFile(inFile, zos, "");  

        zos.close();  

    }  

    //压缩文件  

    public static void zipFile(File inFile, ZipOutputStream zos, String dir) throws IOException {  

        if (inFile.isDirectory()) {  

            File[] files = inFile.listFiles();  

            for (File file:files)  

                zipFile(file, zos, dir + "\\" + inFile.getName());  

        } else {  

            String entryName = null;  

            if (!"".equals(dir))  

                entryName = dir + "\\" + inFile.getName();  

            else  

                entryName = inFile.getName();  

            ZipEntry entry = new ZipEntry(entryName);  

            zos.putNextEntry(entry);  

            InputStream is = new FileInputStream(inFile);  

            int len = 0;  

            while ((len = is.read()) != -1)  

                zos.write(len);  

            is.close();  

        }  

  

    }  

      

}  

 

解压缩文件: 
 

 

Java代码  


import java.io.File;  

import java.io.FileInputStream;  

import java.io.FileOutputStream;  

import java.io.IOException;  

import java.io.InputStream;  

import java.io.OutputStream;  

import java.nio.charset.Charset;  

import java.util.Enumeration;  

import java.util.zip.ZipEntry;  

import java.util.zip.ZipFile;  

import java.util.zip.ZipInputStream;  

  

public class ZipInputStreamTest {  

  

    public static void main(String args[]) throws IOException {  

        File file = new File("D:\\test.zip");//压缩文件  

        ZipFile zipFile = new ZipFile(file, Charset.forName("GBK"));//实例化ZipFile,并指定其编码格式,防止中文乱码和解压错误,每一个zip压缩文件都可以表示为一个ZipFile  

        //实例化一个Zip压缩文件的ZipInputStream对象,可以利用该类的getNextEntry()方法依次拿到每一个ZipEntry对象  

        ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(file), Charset.forName("GBK"));  

          

        //直接利用ZipFile进行解压  

        unpack(zipFile);  

          

        //利用ZipFile和ZipInputStream进行解压  

        unpack(zipFile, zipInputStream);  

          

    }  

      

    /** 

     * 该方法是通过ZipFile和ZipInputStream共同来解压文件的,通过ZipInputStream可以拿到ZipFile中的每一个 

     * ZipEntry对象,然后通过ZipFile的getInputStream(ZipEntry zipEntry)方法拿到对应的每一个ZipEntry的 

     * 输入流,从而实现文件的解压 

     * @param zipFile 

     * @param zipInputStream 

     * @throws IOException 

     */  

    public static void unpack(ZipFile zipFile, ZipInputStream zipInputStream) throws IOException {  

        ZipEntry zipEntry = null;  

        while ((zipEntry = zipInputStream.getNextEntry()) != null) {  

            String fileName = zipEntry.getName();  

            File temp = new File("D:\\unpackTest\\" + fileName);  

            if (! temp.getParentFile().exists())  

                temp.getParentFile().mkdirs();  

            OutputStream os = new FileOutputStream(temp);  

            //通过ZipFile的getInputStream方法拿到具体的ZipEntry的输入流  

            InputStream is = zipFile.getInputStream(zipEntry);  

            int len = 0;  

            System.out.println(zipEntry.getName());  

            while ((len = is.read()) != -1)  

                os.write(len);  

            os.close();  

            is.close();  

        }  

        zipInputStream.close();  

    }  

      

    /** 

     * 该方法是直接通过ZipFile的entries()方法拿到包含所有的ZipEntry对象的Enumeration对象, 

     * 接下来的操作和上面的是一样的 

     * @param zipFile 

     * @throws IOException 

     */  

    public static void unpack(ZipFile zipFile) throws IOException {  

        Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zipFile.entries();  

        while (entries.hasMoreElements()) {  

            ZipEntry zipEntry = entries.nextElement();  

            String fileName = zipEntry.getName();  

            File temp = new File("D:\\unpackTest2\\" + fileName);  

            if (! temp.getParentFile().exists())  

                temp.getParentFile().mkdirs();  

            OutputStream os = new FileOutputStream(temp);  

            //通过ZipFile的getInputStream方法拿到具体的ZipEntry的输入流  

            InputStream is = zipFile.getInputStream(zipEntry);  

            int len = 0;  

            while ((len = is.read()) != -1)  

                os.write(len);  

            os.close();  

            is.close();  

        }  

    }  

      

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