`

Java IO流 Zip文件的压缩和解压缩

阅读更多

最近在复习java的IO流,发现zip流这块还是空白,所以补补课,发现一片比较好的文档,所以转载了,出处:http://blog.csdn.net/hanshileiai/article/details/6718375?reload个人觉得写的比较好,其中的方法我也按照它的思路测试过,没有问题。

 

1、了解压缩流的主要作用

2、了解JAVA IO 支持的三种压缩格式

3、掌握ZipOutputStream、ZipFile、ZipInputStream 三个类的作用

具体内容

经常可以看见各种压缩文件:zip、jar、GZ、

正常情况下在IO 操作中,所有的类库都是在 IO 包中。

在实例化ZipEntry 的时候,要设置名称,此名称实际上就是压缩文件中每一个元素的名称。

1、ZipOutputStream

此类的功能就是完成ZIP格式输出的。

继承关系:

 

java.lang.Object
  
extended by
java.io.OutputStream
      
extended by
java.io.FilterOutputStream
          
extended by
java.util.zip.DeflaterOutputStream
              
extended by
java.util.zip.ZipOutputStream

 

从定义可以发现,就是一个字节的输出流。

 

public void putNextEntry(ZipEntry e)
                  throws IOException

在压缩文件中,每一个压缩的内容都可以用一个ZipEntry 表示,所以在进行压缩之前必须通过putNextEntry 设置一个ZipEntry 即可。

 

 

[java] view plaincopy
 
  1. import java.io.File ;  
  2. import java.io.FileInputStream ;  
  3. import java.io.InputStream ;  
  4. import java.util.zip.ZipEntry ;  
  5. import java.util.zip.ZipOutputStream ;  
  6. import java.io.FileOutputStream ;  
  7. public class ZipOutputStreamDemo01{  
  8.     public static void main(String args[]) throws Exception{    // 所有异常抛出  
  9.         File file = new File("d:" + File.separator + "mldn.txt") ;  // 定义要压缩的文件  
  10.         File zipFile = new File("d:" + File.separator + "mldn.zip") ;   // 定义压缩文件名称  
  11.         InputStream input = new FileInputStream(file) ; // 定义文件的输入流  
  12.         ZipOutputStream zipOut = null ; // 声明压缩流对象  
  13.         zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;  
  14.         zipOut.putNextEntry(new ZipEntry(file.getName())) ; // 设置ZipEntry对象  
  15.         zipOut.setComment("www.mldnjava.cn") ;  // 设置注释  
  16.         int temp = 0 ;  
  17.         while((temp=input.read())!=-1){ // 读取内容  
  18.             zipOut.write(temp) ;    // 压缩输出  
  19.         }  
  20.         input.close() ; // 关闭输入流  
  21.         zipOut.close() ;    // 关闭输出流  
  22.     }  
  23. };  

以上的操作代码完成的只是一个文件的压缩,如果要完成一个文件夹呢?

 

[java] view plaincopy
 
  1. import java.io.File ;  
  2. import java.io.FileInputStream ;  
  3. import java.io.InputStream ;  
  4. import java.util.zip.ZipEntry ;  
  5. import java.util.zip.ZipOutputStream ;  
  6. import java.io.FileOutputStream ;  
  7. public class ZipOutputStreamDemo02{  
  8.     public static void main(String args[]) throws Exception{    // 所有异常抛出  
  9.         File file = new File("d:" + File.separator + "mldn") ;  // 定义要压缩的文件夹  
  10.         File zipFile = new File("d:" + File.separator + "mldndir.zip") ;    // 定义压缩文件名称  
  11.         InputStream input = null ;  // 定义文件输入流  
  12.         ZipOutputStream zipOut = null ; // 声明压缩流对象  
  13.         zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;  
  14.         zipOut.setComment("www.mldnjava.cn") ;  // 设置注释  
  15.         int temp = 0 ;  
  16.         if(file.isDirectory()){ // 判断是否是文件夹  
  17.             File lists[] = file.listFiles() ;   // 列出全部文件  
  18.             for(int i=0;i<lists.length;i++){  
  19.                 input = new FileInputStream(lists[i]) ; // 定义文件的输入流  
  20.                 zipOut.putNextEntry(new ZipEntry(file.getName()  
  21.                     +File.separator+lists[i].getName())) ;  // 设置ZipEntry对象  
  22.                 while((temp=input.read())!=-1){ // 读取内容  
  23.                     zipOut.write(temp) ;    // 压缩输出  
  24.                 }  
  25.                 input.close() ; // 关闭输入流  
  26.             }  
  27.         }  
  28.         zipOut.close() ;    // 关闭输出流  
  29.     }  
  30. };  

3.2 ZipFile

 

是一个专门表示压缩文件的类。

ZipFile 在实例化的时候必须接收File 类的实例。此File 类的实例是指向一个压缩 *.zip 文件。

第一步:为 ZipFile 实例化

实例化时需要接收File  类的引用

[java] view plaincopy
 
  1. import java.io.File ;  
  2. import java.io.FileInputStream ;  
  3. import java.io.InputStream ;  
  4. import java.util.zip.ZipEntry ;  
  5. import java.util.zip.ZipOutputStream ;  
  6. import java.util.zip.ZipFile ;  
  7. import java.io.FileOutputStream ;  
  8. public class ZipFileDemo01{  
  9.     public static void main(String args[]) throws Exception{    // 所有异常抛出  
  10.         File file = new File("d:" + File.separator + "mldn.zip") ;  // 找到压缩文件  
  11.         ZipFile zipFile = new ZipFile(file) ;   // 实例化ZipFile对象  
  12.         System.out.println("压缩文件的名称:" + zipFile.getName()) ;    // 得到压缩文件的名称  
  13.     }  
  14. };  

通过ZipFile 文件,为mldn.zip 进行解压缩操作。

 

[java] view plaincopy
 
  1. import java.io.File ;  
  2. import java.io.FileInputStream ;  
  3. import java.io.InputStream ;  
  4. import java.util.zip.ZipEntry ;  
  5. import java.util.zip.ZipOutputStream ;  
  6. import java.io.FileOutputStream ;  
  7. public class ZipOutputStreamDemo02{  
  8.     public static void main(String args[]) throws Exception{    // 所有异常抛出  
  9.         File file = new File("d:" + File.separator + "mldn") ;  // 定义要压缩的文件夹  
  10.         File zipFile = new File("d:" + File.separator + "mldndir.zip") ;    // 定义压缩文件名称  
  11.         InputStream input = null ;  // 定义文件输入流  
  12.         ZipOutputStream zipOut = null ; // 声明压缩流对象  
  13.         zipOut = new ZipOutputStream(new FileOutputStream(zipFile)) ;  
  14.         zipOut.setComment("www.mldnjava.cn") ;  // 设置注释  
  15.         int temp = 0 ;  
  16.         if(file.isDirectory()){ // 判断是否是文件夹  
  17.             File lists[] = file.listFiles() ;   // 列出全部文件  
  18.             for(int i=0;i<lists.length;i++){  
  19.                 input = new FileInputStream(lists[i]) ; // 定义文件的输入流  
  20.                 zipOut.putNextEntry(new ZipEntry(file.getName()  
  21.                     +File.separator+lists[i].getName())) ;  // 设置ZipEntry对象  
  22.                 while((temp=input.read())!=-1){ // 读取内容  
  23.                     zipOut.write(temp) ;    // 压缩输出  
  24.                 }  
  25.                 input.close() ; // 关闭输入流  
  26.             }  
  27.         }  
  28.         zipOut.close() ;    // 关闭输出流  
  29.     }  
  30. };  

以上的操作中,有一个问题,必须知道压缩文件中的每一个压缩实体的名称才可以进行解压缩操作,而如果现在在假设是一个文件夹呢? 
3、ZipInputStream

 

定义:

java.lang.Object
  
extended by
java.io.InputStream
      
extended by
java.io.FilterInputStream
          
extended by
java.util.zip.InflaterInputStream
              
extended by
java.util.zip.ZipInputStream

 

[java] view plaincopy
 
  1. import java.io.File ;  
  2. import java.io.FileInputStream ;  
  3. import java.io.InputStream ;  
  4. import java.util.zip.ZipEntry ;  
  5. import java.util.zip.ZipInputStream ;  
  6. import java.io.FileInputStream ;  
  7. public class ZipInputStreamDemo01{  
  8.     public static void main(String args[]) throws Exception{    // 所有异常抛出  
  9.         File zipFile = new File("d:" + File.separator + "mldn.zip") ;   // 定义压缩文件名称  
  10.         ZipInputStream input = null ;   // 定义压缩输入流  
  11.         input = new ZipInputStream(new FileInputStream(zipFile)) ;  // 实例化ZIpInputStream  
  12.         ZipEntry entry = input.getNextEntry() ; // 得到一个压缩实体  
  13.         System.out.println("压缩实体名称:" + entry.getName()) ;  
  14.         input.close() ;  
  15.     }  
  16. };  

利用此特性并结合 ZipFile 就可以完成解压缩文件夹的功能。

 

ZipFile 对象,可以找到每一个ZipEntry 的输入流。但是ZipInputStream 并不能得到每一个输入流,所以需要使用ZipFile,但是ZipInputStream  在取得每一个ZipEntry 的时候,不需要每一个ZipEntry 的时候,不需要每一个ZipEntry 的名称。

[java] view plaincopy
 
  1. import java.io.File ;  
  2. import java.io.OutputStream ;  
  3. import java.io.InputStream ;  
  4. import java.util.zip.ZipEntry ;  
  5. import java.util.zip.ZipFile ;  
  6. import java.util.zip.ZipInputStream ;  
  7. import java.io.FileInputStream ;  
  8. import java.io.FileOutputStream ;  
  9. public class ZipInputStreamDemo02{  
  10.     public static void main(String args[]) throws Exception{    // 所有异常抛出  
  11.         File file = new File("d:" + File.separator + "mldndir.zip") ;   // 定义压缩文件名称  
  12.         File outFile = null ;   // 输出文件的时候要有文件夹的操作  
  13.         ZipFile zipFile = new ZipFile(file) ;   // 实例化ZipFile对象  
  14.         ZipInputStream zipInput = null ;    // 定义压缩输入流  
  15.         OutputStream out = null ;   // 定义输出流,用于输出每一个实体内容  
  16.         InputStream input = null ;  // 定义输入流,读取每一个ZipEntry  
  17.         ZipEntry entry = null ; // 每一个压缩实体  
  18.         zipInput = new ZipInputStream(new FileInputStream(file)) ;  // 实例化ZIpInputStream  
  19.         while((entry = zipInput.getNextEntry())!=null){ // 得到一个压缩实体  
  20.             System.out.println("解压缩" + entry.getName() + "文件。") ;  
  21.             outFile = new File("d:" + File.separator + entry.getName()) ;   // 定义输出的文件路径  
  22.             if(!outFile.getParentFile().exists()){  // 如果输出文件夹不存在  
  23.                 outFile.getParentFile().mkdir() ;   // 创建文件夹  
  24.             }  
  25.             if(!outFile.exists()){  // 判断输出文件是否存在  
  26.                 outFile.createNewFile() ;   // 创建文件  
  27.             }  
  28.             input = zipFile.getInputStream(entry) ; // 得到每一个实体的输入流  
  29.             out = new FileOutputStream(outFile) ;   // 实例化文件输出流  
  30.             int temp = 0 ;  
  31.             while((temp=input.read())!=-1){  
  32.                 out.write(temp) ;  
  33.             }  
  34.             input.close() ;     // 关闭输入流  
  35.             out.close() ;   // 关闭输出流  
  36.         }  
  37.         input.close() ;  
  38.     }  
  39. };  

如果目录不存在,则应该进行创建操作。

 

总结:

1、压缩文件中的每一个压缩实体都使用ZipEntry 保存,一个压缩文件中可能包含一个或多个的ZipEntry 对象。

2、在JAVA中可以进行zip、jar、gz、三种格式的压缩支持,操作流程基本上是一样的

3、ZipOutputStream 可以进行压缩输出,但是输出的位置不一定是文件。

4、ZipFile 表示每一个压缩文件,可以得到每一个压缩实体的输入流

5、ZipInputStream 可以得到每一个实体,但是却无法得到每一个实体的输入流。

 

附件为我个人测试用的代码,和文章中提到的方法和思路基本是一致的。

 

附加一段拷贝文件夹的代码:

 

package com.fit.test.io.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {

	private static void copy(File originalFile, File goalFile)
			throws IOException {

		if (!goalFile.exists()) {
			goalFile.mkdirs();
		}

		if (originalFile.isFile()) {
			copy(originalFile, new File(goalFile, originalFile.getName()));
		}
		if (originalFile.isDirectory()) {
			copyDirectory(originalFile, goalFile);
		}

	}

	private static void copyDirectory(File originalFile, File goalFile)
			throws IOException {

		File toInDir = new File(goalFile, originalFile.getName());

		toInDir.mkdir();

		File[] fileList = originalFile.listFiles();

		if (fileList == null || fileList.length == 0) {
			return;
		}

		for (int i = 0; i < fileList.length; i++) {
			if (fileList[i].isDirectory()) {
				copyDirectory(fileList[i], toInDir);
			} else if (fileList[i].isFile()) {
				copyFile(fileList[i], new File(toInDir, fileList[i].getName()));
			}
		}
	}

	private static void copyFile(File originalFile, File goalFile)
			throws IOException {

		FileInputStream fis = null;

		FileOutputStream fos = null;

		fis = new FileInputStream(originalFile);

		fos = new FileOutputStream(goalFile);

		int temp = -1;

		byte[] b = new byte[1024];

		while ((temp = fis.read(b)) != -1) {
			fos.write(b, 0, temp);
		}

		fos.flush();
		fos.close();
		fis.close();

	}

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

		File originalFile = new File("F:\\Work\\apache-ant-1.9.2-bin");

		File goalFile = new File("F:\\Work\\back");

		copy(originalFile, goalFile);

		System.out.println("拷贝完成");
		
		
	}
}

 

 

 

  • src.zip (2.8 KB)
  • 下载次数: 27
分享到:
评论
2 楼 飞出四季做的茧 2018-11-07  
kris_zhang 写道
int temp = 0 ; 
        while((temp=input.read())!=-1){ // 读取内容 
            zipOut.write(temp) ;    // 压缩输出 
        } 

这种方式我测试一下,发现速度非常慢,26M的文件花了31秒 。有方法提高压缩速度么?


byte[] tempBuf = new byte[1024];
int length;
while((length = input.read(tempBuf)) != -1) {
    zipOut.write(tempBuf, 0, length);
}
1 楼 kris_zhang 2017-06-30  
int temp = 0 ; 
        while((temp=input.read())!=-1){ // 读取内容 
            zipOut.write(temp) ;    // 压缩输出 
        } 

这种方式我测试一下,发现速度非常慢,26M的文件花了31秒 。有方法提高压缩速度么?

相关推荐

    Java压缩和解压缩zip文件

    在Java编程环境中,处理压缩和解压缩文件是一项常见的任务,特别是在需要打包或传输大量数据时。本篇文章将详细探讨如何使用Java内置的类库来实现ZIP文件的压缩和解压缩,以及解决中文文件名出现乱码的问题。 首先...

    java 中 zip压缩文件解压工具类

    在Java编程环境中,处理文件压缩和解压缩是常见的任务,特别是在构建可执行的JAR包或者处理数据传输时。本文将深入探讨如何使用Java来处理ZIP文件,特别是针对标题所提及的“java 中 zip压缩文件解压工具类”。我们...

    JAVA文件压缩与解压缩实践(源代码+论文)

    1. **Java压缩库**:Java标准库提供了`java.util.zip`包,它包含了多种压缩和解压缩的类,如`ZipOutputStream`、`ZipInputStream`、`GZIPOutputStream`和`GZIPInputStream`,用于处理ZIP和GZIP格式的文件。...

    java语言实现apk文件的压缩和解压缩

    在Java编程环境中,APK文件是Android应用的安装包,通常是`.apk`格式,它包含了应用的所有资源、代码和配置信息。本实例将探讨如何利用...总之,Java提供的`java.util.zip`库为处理压缩和解压缩任务提供了强大的支持。

    zip 压缩 文件 Java

    在Java编程语言中,处理ZIP压缩文件是一项常见的任务,它涉及到文件和目录的打包与解压。本篇文章将深入探讨如何使用Java实现ZIP文件的压缩和解压缩操作,以及涉及的相关知识点。 首先,理解ZIP文件格式是基础。ZIP...

    java实现压缩和压缩zip格式文件的功能

    以下是一份详细的介绍,讲解如何利用Java来实现ZIP文件的压缩和解压缩功能。 首先,我们要理解ZIP文件格式。ZIP是一种广泛使用的文件归档格式,它能将多个文件或目录打包成一个单一的ZIP文件,方便存储和传输。在...

    JAVA文件压缩与解压缩实践,java解压缩zip文件,Java源码.zip

    本篇文章将深入探讨如何使用Java来实现ZIP文件的压缩和解压缩功能,以及相关的Java源码实践。 一、Java压缩文件到ZIP 在Java中,我们可以使用`java.util.zip`包中的`ZipOutputStream`类来实现文件或文件夹的压缩。...

    java文件分割压缩

    而`ZipInputStream`则可以用来读取和解压缩ZIP文件。在`ZipOperation`和`ZipDirectory`类中,可能会包含创建和管理ZIP档案的逻辑。 6. **类的设计**:`Work5`, `Work5_new`, `OneTest`, `JieMu`等可能是实现文件...

    java实现的解压与压缩 zip和rar类型的

    在Java编程环境中,处理压缩和解压缩文件是常见的任务,主要涉及到两个标准库中的类:`java.util.zip`和第三方库如Apache Commons Compress。本文将深入探讨如何使用Java实现ZIP和RAR类型的压缩与解压操作,以及相关...

    java zip解压缩

    Java Zip压缩和解压缩是Java开发中常见的文件处理任务,主要涉及到`java.util.zip`包中的类和方法。本文将详细讲解如何使用Java进行Zip文件的压缩与解压缩操作,并结合给定的标签"源码"和"工具"来探讨实际应用场景。...

    java zip压缩解压工具解决中文乱码问题

    在Java编程中,处理压缩和解压缩ZIP文件是一项常见的任务,尤其当文件中包含中文字符时,可能会遇到中文乱码的问题。这是因为Java的标准库在处理非ASCII编码时可能存在不足。本篇文章将详细介绍如何使用Java标准库...

    Java用Zip压缩多个文件实例源码

    在Java编程语言中,压缩和解压缩文件是常见的任务,特别是在处理大量数据或者进行文件传输时。本篇文章将深入探讨如何使用Java的内置库`java.util.zip`来实现Zip文件的压缩功能,尤其是针对多个文件的压缩实例。我们...

    JAVA解压缩ZIP或RAR格式的文件

    在Java编程环境中,解压缩ZIP或RAR格式的文件是一项常见的任务,这主要涉及到I/O流、文件操作以及压缩和解压缩库的使用。本篇将深入讲解如何在Java中实现这个功能,同时会介绍一些相关的工具和源码。 首先,对于ZIP...

    使用Java实现文件的压缩和解压缩.doc

    在Java编程中,实现文件的压缩和解压缩是一项常见的任务,这通常涉及到对`java.util.zip`包的使用。`ZipOutputStream`和`ZipInputStream`是Java标准库提供的两个关键类,它们分别用于文件的压缩和解压缩。然而,需要...

    Java zip 压缩/解压源码

    这个`Java zip 压缩/解压源码`的资源提供了一个简洁易用的API,使得开发者能够方便地对文件进行压缩和解压缩操作。下面我们将深入探讨Java中处理`zip`文件的相关知识。 1. **Java ZipFile类**: `java.util.zip....

    java压缩和解压缩文件

    Java编程语言提供了丰富的库来处理文件的压缩和解压缩任务,这主要归功于Java标准库中的`java.util.zip`包。在这个包中,我们有`ZipOutputStream`和`ZipInputStream`类用于创建和读取ZIP文件,以及`GZIPOutputStream...

    使用Huffman对文件进行压缩和解压缩

    7. **HuffmanTest**:这个文件名可能是一个测试类,用于实现上述的压缩和解压缩过程。在Java中,可以使用`java.io`和`java.nio`包下的类进行文件操作,使用`java.util`包下的数据结构辅助实现Huffman算法。 实现...

    java_io.zip_zip

    Java IO 是Java平台中用于处理输入输出操作的重要部分,它为开发者提供了丰富的类库来读取、写入、创建和管理文件以及数据流。在Java中,IO操作主要分为两个部分:字节流(Byte Stream)和字符流(Character Stream...

Global site tag (gtag.js) - Google Analytics