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

来源:互联网 发布:网络销售有前景吗 编辑:程序博客网 时间:2024/05/17 23:08

我们经常会使用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代码  收藏代码
  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.nio.charset.Charset;  
  7. import java.util.zip.ZipEntry;  
  8. import java.util.zip.ZipOutputStream;  
  9.   
  10. public class ZipOutputStreamTest {  
  11.   
  12.     public static void main(String args[]) throws IOException {  
  13.         test1();  
  14.         test2();  
  15.     }  
  16.       
  17.     public static void test1() throws IOException {  
  18.         ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("D:\\testZip.zip"), Charset.forName("GBK"));  
  19.         //实例化一个名称为ab.txt的ZipEntry对象  
  20.         ZipEntry entry = new ZipEntry("ab.txt");  
  21.         //设置注释  
  22.         zos.setComment("zip测试for单个文件");  
  23.         //把生成的ZipEntry对象加入到压缩文件中,而之后往压缩文件中写入的内容都会放在这个ZipEntry对象里面  
  24.         zos.putNextEntry(entry);  
  25.         InputStream is = new FileInputStream("D:\\ab.txt");  
  26.         int len = 0;  
  27.         while ((len = is.read()) != -1)  
  28.             zos.write(len);  
  29.         is.close();  
  30.         zos.close();  
  31.     }  
  32.       
  33.     public static void test2() throws IOException {  
  34.         File inFile = new File("D:\\test");  
  35.         ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("D:\\test.zip"), Charset.forName("GBK"));  
  36.         zos.setComment("多文件处理");  
  37.         zipFile(inFile, zos, "");  
  38.         zos.close();  
  39.     }  
  40.     //压缩文件  
  41.     public static void zipFile(File inFile, ZipOutputStream zos, String dir) throws IOException {  
  42.         if (inFile.isDirectory()) {  
  43.             File[] files = inFile.listFiles();  
  44.             for (File file:files)  
  45.                 zipFile(file, zos, dir + "\\" + inFile.getName());  
  46.         } else {  
  47.             String entryName = null;  
  48.             if (!"".equals(dir))  
  49.                 entryName = dir + "\\" + inFile.getName();  
  50.             else  
  51.                 entryName = inFile.getName();  
  52.             ZipEntry entry = new ZipEntry(entryName);  
  53.             zos.putNextEntry(entry);  
  54.             InputStream is = new FileInputStream(inFile);  
  55.             int len = 0;  
  56.             while ((len = is.read()) != -1)  
  57.                 zos.write(len);  
  58.             is.close();  
  59.         }  
  60.   
  61.     }  
  62.       
  63. }  

 

解压缩文件: 

 

 

Java代码  收藏代码
  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3. import java.io.FileOutputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.OutputStream;  
  7. import java.nio.charset.Charset;  
  8. import java.util.Enumeration;  
  9. import java.util.zip.ZipEntry;  
  10. import java.util.zip.ZipFile;  
  11. import java.util.zip.ZipInputStream;  
  12.   
  13. public class ZipInputStreamTest {  
  14.   
  15.     public static void main(String args[]) throws IOException {  
  16.         File file = new File("D:\\test.zip");//压缩文件  
  17.         ZipFile zipFile = new ZipFile(file, Charset.forName("GBK"));//实例化ZipFile,并指定其编码格式,防止中文乱码和解压错误,每一个zip压缩文件都可以表示为一个ZipFile  
  18.         //实例化一个Zip压缩文件的ZipInputStream对象,可以利用该类的getNextEntry()方法依次拿到每一个ZipEntry对象  
  19.         ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(file), Charset.forName("GBK"));  
  20.           
  21.         //直接利用ZipFile进行解压  
  22.         unpack(zipFile);  
  23.           
  24.         //利用ZipFile和ZipInputStream进行解压  
  25.         unpack(zipFile, zipInputStream);  
  26.           
  27.     }  
  28.       
  29.     /** 
  30.      * 该方法是通过ZipFile和ZipInputStream共同来解压文件的,通过ZipInputStream可以拿到ZipFile中的每一个 
  31.      * ZipEntry对象,然后通过ZipFile的getInputStream(ZipEntry zipEntry)方法拿到对应的每一个ZipEntry的 
  32.      * 输入流,从而实现文件的解压 
  33.      * @param zipFile 
  34.      * @param zipInputStream 
  35.      * @throws IOException 
  36.      */  
  37.     public static void unpack(ZipFile zipFile, ZipInputStream zipInputStream) throws IOException {  
  38.         ZipEntry zipEntry = null;  
  39.         while ((zipEntry = zipInputStream.getNextEntry()) != null) {  
  40.             String fileName = zipEntry.getName();  
  41.             File temp = new File("D:\\unpackTest\\" + fileName);  
  42.             if (! temp.getParentFile().exists())  
  43.                 temp.getParentFile().mkdirs();  
  44.             OutputStream os = new FileOutputStream(temp);  
  45.             //通过ZipFile的getInputStream方法拿到具体的ZipEntry的输入流  
  46.             InputStream is = zipFile.getInputStream(zipEntry);  
  47.             int len = 0;  
  48.             System.out.println(zipEntry.getName());  
  49.             while ((len = is.read()) != -1)  
  50.                 os.write(len);  
  51.             os.close();  
  52.             is.close();  
  53.         }  
  54.         zipInputStream.close();  
  55.     }  
  56.       
  57.     /** 
  58.      * 该方法是直接通过ZipFile的entries()方法拿到包含所有的ZipEntry对象的Enumeration对象, 
  59.      * 接下来的操作和上面的是一样的 
  60.      * @param zipFile 
  61.      * @throws IOException 
  62.      */  
  63.     public static void unpack(ZipFile zipFile) throws IOException {  
  64.         Enumeration<ZipEntry> entries = (Enumeration<ZipEntry>) zipFile.entries();  
  65.         while (entries.hasMoreElements()) {  
  66.             ZipEntry zipEntry = entries.nextElement();  
  67.             String fileName = zipEntry.getName();  
  68.             File temp = new File("D:\\unpackTest2\\" + fileName);  
  69.             if (! temp.getParentFile().exists())  
  70.                 temp.getParentFile().mkdirs();  
  71.             OutputStream os = new FileOutputStream(temp);  
  72.             //通过ZipFile的getInputStream方法拿到具体的ZipEntry的输入流  
  73.             InputStream is = zipFile.getInputStream(zipEntry);  
  74.             int len = 0;  
  75.             while ((len = is.read()) != -1)  
  76.                 os.write(len);  
  77.             os.close();  
  78.             is.close();  
  79.         }  
  80.     }  
  81.