`
234390216
  • 浏览: 10238815 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462902
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775986
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398756
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:395158
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:680175
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:531150
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1185043
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:468829
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151494
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68344
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多

我们经常会使用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对象。

 

压缩文件:

 

public class ZipOutputStreamTest {

	public static void main(String args[]) throws IOException {
		test1();
		test2();
	}
	
	private 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();
	}
	
	private static void test2() throws IOException {
		File inFile = new File("D:\\test1");
		ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("D:\\test1.zip"), Charset.forName("GBK"));
		zos.setComment("多文件处理");
		zipFile(inFile, zos, null);
		zos.close();
	}

	/**
	 * 压缩文件
	 * @param inFile 需要进行压缩的文件
	 * @param zos 需要压缩到的压缩文件对应的输出流
	 * @param dir 需要把文件压缩到的压缩文件里面的相对路径
	 * @throws IOException
	 */
	private static void zipFile(File inFile, ZipOutputStream zos, String dir) throws IOException {
		String entryName = null;//带相对路径的
		if (dir != null) {//传递进来的dir已经是已文件路径分隔符结尾的了
			entryName = dir + inFile.getName();
		} else {
			entryName = inFile.getName();
		}
		if (inFile.isDirectory()) {
			entryName += File.separator;//写目录的时候要以文件分隔符结尾
		}
		ZipEntry entry = new ZipEntry(entryName);
		zos.putNextEntry(entry);
		if (inFile.isDirectory()) {
			File[] files = inFile.listFiles();
			for (File file : files)
				zipFile(file, zos, entryName);
		} else {
			InputStream is = new FileInputStream(inFile);
			int len = 0;
			while ((len = is.read()) != -1)
				zos.write(len);
			is.close();
		}

	}
	
}

 

解压缩文件: 

 

 

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();  
            if (!zipEntry.isDirectory()) {//非目录
            	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<? extends ZipEntry> entries = 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();  
            if (!zipEntry.isDirectory()) {//非目录才进行写入
            	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();  
            }
        }  
    }  
      
}  

 

 

 

 

 

 

13
6
分享到:
评论
7 楼 234390216 2017-01-02  
Sun-light-Shell 写道
如果压缩包里面有文件夹的话,会解压失败

加一下判断,是目录的时候只创建目录,不写内容。
6 楼 Sun-light-Shell 2016-11-29  
如果压缩包里面有文件夹的话,会解压失败
5 楼 alex295111 2012-06-02  
这个要jdk1.7才有
大家可以参考:
https://blogs.oracle.com/xuemingshen/entry/non_utf_8_encoding_in
4 楼 234390216 2012-05-05  
dying 写道
ZipOutputStream有你那个构造方法?我在API上只看到一个构造方法ZipOutputStream(OutputStream out)
不知道哪里转来的,也不看下

源码里面是有public ZipOutputStream(OutputStream out, Charset charset) {}这个构造方法的,这个构造方法API里面确实没有写出来,像你说的那个构造方法默认使用的字符编码是UTF-8,当需要指定字符编码的时候就需要用public ZipOutputStream(OutputStream out, Charset charset) {}这个构造方法了,关于这两个构造方法你可以查看ZipOutputStream的源码得到你想要的答案。
3 楼 dying 2012-05-05  
ZipOutputStream有你那个构造方法?我在API上只看到一个构造方法ZipOutputStream(OutputStream out)
不知道哪里转来的,也不看下
2 楼 234390216 2011-11-04  
MacTavish 写道
怎么我运行不了的呢?

哪里运行不了,有什么问题呢?我运行是没有问题的
1 楼 MacTavish 2011-11-04  
怎么我运行不了的呢?

相关推荐

    java 压缩和解压缩Zip、Jar、Gzip文件实例代码

    以上代码展示了Java中压缩和解压缩ZIP、JAR、GZIP文件的基本方法。在实际应用中,可能需要根据具体需求进行调整,如处理异常、优化性能或增加更多的功能,如加密、校验等。同时,确保正确关闭流以避免资源泄漏。

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

    本实践主要关注如何使用Java来处理ZIP格式的压缩文件,以下将详细介绍相关知识点。 1. **Java档案API(Java Archive API, JAR)** Java标准库提供了一个强大的API来处理各种类型的档案文件,包括ZIP格式。`java....

    用java.util.zip包现数据压缩与解压

    除了 ZIP 文件格式之外,`java.util.zip` 包还支持 GZIP 压缩。GZIP 是一种广泛使用的文件格式,通常用于单个文件的压缩。 ##### GZIP 压缩 使用 `GZIPOutputStream` 可以将文件压缩为 GZIP 格式: ```java ...

    java zip rar(区分有无密码的RAR文件) gz ftp工具类

    在Java编程环境中,处理压缩文件和网络传输是常见的任务,特别是在开发企业级应用程序时。本文将详细介绍标题和描述中提到的几个关键知识点:Java中的zip、rar(包括处理带密码的RAR文件)、gz压缩,以及FTP工具类的...

    JAVA文件压缩与解压缩实践的实现.rar

    压缩API:Java提供了java.util.zip和java.util.jar包来实现文件的压缩和解压缩操作。 压缩算法:通过选择不同的压缩算法,如DEFLATE算法用于ZIP格式,实现对文件的压缩。 流操作:使用Java的输入输出流(InputStream...

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

    Java标准库提供了`java.util.zip.GZIPOutputStream`和`java.util.zip.GZIPInputStream`用于GZIP格式的压缩和解压缩。GZIP是一种广泛使用的压缩格式,它基于DEFLATE算法。通过这两个类,我们可以轻松地将文件或数据...

    文件GZip压缩AES加密反向解密解压缩代码和jar

    本资源包“文件GZip压缩AES加密反向解密解压缩代码和jar”提供了完整的Java实现,使得开发者能够方便地对文件进行GZip压缩、AES加密,以及后续的解密和解压缩操作。下面将详细解释这些技术及其应用。 首先,GZip...

    java实现压缩与解压缩

    首先,Java标准库提供了`java.util.zip`包,它包含了一系列类用于处理ZIP和GZIP格式的压缩文件。例如,`ZipOutputStream`和`ZipInputStream`用于创建和读取ZIP文件,而`GZIPOutputStream`和`GZIPInputStream`则用于...

    commons-compress-1.18.jar【说明:Java、压缩库、压缩算法、解压缩、数据存储、压缩格式】

    commons-compress-1.18.jar是一个Java压缩库,专注于数据的压缩和解压缩功能,支持多种常见的压缩格式。它提供了广泛的压缩算法和工具,用于数据存储、传输和优化存储空间。 【使用人群】 适用于Java开发者、数据...

    号称现最高解压缩比的压缩软件7-zip

    此外,7-Zip 还提供了AES-256加密功能,确保了压缩文件的安全性,对于需要保密的文件提供了额外的保护。 7-Zip 的界面简洁直观,无论是命令行版本还是图形用户界面(GUI),操作都非常简单。在 GUI 版本中,用户...

    linux和aix下常用的压缩和解压缩命令.pdf

    gzip 命令用于压缩文件,生成的文件后缀名为 .gz。gunzip 命令用于解压缩.gz 文件。 示例: ``` [root@localhost tmp]# gzip 文件名 [root@localhost tmp]# gunzip 文件名.gz ``` 二、tar 命令 tar 命令用于将...

    GZipper:JavaFX文件存档器和哈希工具。 压缩和解压缩ZIP,JAR,GZIP和TARBALL(GZIP,BZIP2或LZMA)

    压缩和解压缩GZIP 压缩水平可以调节如果有压缩机支持 支持正则表达式允许过滤文件/条目 支持深色主题(CSS样式) 消息摘要算法: MD5 SHA-1 SHA-256 SHA-384 SHA-512 支持的语言: 英语 德语 兼容性 该...

    Java中文件的压缩

    这个库提供了多种类和接口,如`ZipOutputStream`用于创建ZIP格式的压缩文件,`GZIPOutputStream`用于创建GZIP格式的压缩文件。例如,如果你想把一个名为`example.txt`的文件压缩成ZIP格式,你可以创建一个`...

    文件压缩与RSA加密JAVA实现

    例如,`ZipOutputStream`和`ZipInputStream`可以用于创建和读取ZIP格式的压缩文件,而`GZIPOutputStream`和`GZIPInputStream`则对应于GZIP格式的压缩。 **RSA加密** RSA(Rivest-Shamir-Adleman)是一种非对称加密...

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

    首先,Java标准库提供了`java.util.zip`包,它包含了多种压缩和解压缩的类,如`ZipOutputStream`用于创建ZIP格式的压缩文件,`GZIPOutputStream`用于创建GZIP格式的压缩文件,以及`InflaterInputStream`和`...

    lz4-java-1.6.0.zip

    1. "lz4-java-1.6.0.jar":这是LZ4库的核心运行时文件,包含了实现LZ4压缩和解压缩功能的Java类和方法。开发人员在他们的Java项目中可以引用这个JAR文件,以便在代码中使用LZ4压缩和解压缩数据。 2. "lz4-java-...

    简单压缩工具(Java).rar_java工具_压缩工具

    在给定的压缩包中,`Jar.java`可能是一个实现了对JAR(Java Archive)文件进行压缩和解压缩的类,因为JAR本质上也是一种ZIP格式的文件。 `JarTool.java`可能是与`Jar.java`配套使用的命令行工具,允许用户通过...

    java压缩文件truezip6.6

    "truezip6.6"是一个专门针对这些问题的Java库,它为开发者提供了强大的文件系统接口,使得在Java中操作压缩文件变得更加便捷和可靠。 TrueZip库的核心功能在于提供了一个与Java标准文件系统API兼容的接口,这意味着...

    java文件压缩

    除了以上提到的,Java还提供了`java.util.zip`包,它包含了一些基本的压缩和解压缩功能,如`ZipOutputStream`和`ZipInputStream`用于处理ZIP格式,`GZIPOutputStream`和`GZIPInputStream`用于处理GZIP格式。...

Global site tag (gtag.js) - Google Analytics