`
tmj_159
  • 浏览: 707063 次
  • 性别: Icon_minigender_1
  • 来自: 永州
社区版块
存档分类
最新评论

JDK 中压缩和解压缩

 
阅读更多

1.对文件进行压缩和解压

基本很简单,我在windows平台测试过了,上代码

 

package cn.tang.zip;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

public class MyZipUtil {

	public void unzip(File zipFile, File unzipFolder) throws IOException {
		if (!unzipFolder.exists()) {
			unzipFolder.mkdir();
		}
		ZipFile zip = new ZipFile(zipFile);
		unzip(zip, unzipFolder.getAbsolutePath());
		zip.close();
	}

	private void unzip(ZipFile zipFile, String parentDir) throws IOException {
		Enumeration<? extends ZipEntry> entries = zipFile.entries();
		byte[] buffer = new byte[128];
		while (entries.hasMoreElements()) {
			ZipEntry entry = entries.nextElement();
			String entryName = entry.getName();
			File f = new File(parentDir + File.separator + entryName);
			System.out.println(f.getAbsolutePath());
			if (entry.isDirectory()||entryName.endsWith("\\")||entryName.endsWith(File.separator)) {
				if (!f.exists()) {
					f.mkdir();
				}
			} else {
				if (!f.exists())
					f.createNewFile();
				OutputStream os = new BufferedOutputStream(new FileOutputStream(f));
				InputStream is = zipFile.getInputStream(entry);
				int count = -1;
				while ((count=is.read(buffer)) != -1) {
					os.write(buffer, 0, count);
				}
				os.close();
				is.close();
			}
		}
	}

	public void zip(File sourceFile, File zipFile) throws IOException {
		FileOutputStream fos = new FileOutputStream(zipFile);
		ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(fos));
		zip(sourceFile, out, "");
		out.close();
	}

	private void zip(File sourceFile, ZipOutputStream out, String parentDir) throws IOException {
		if (sourceFile == null || !sourceFile.exists())
			throw new FileNotFoundException();
		String currentPath = parentDir + sourceFile.getName();
		if (sourceFile.isDirectory()) {
			ZipEntry entry = new ZipEntry(currentPath + File.separator);
			out.putNextEntry(entry);
			for (File temp : sourceFile.listFiles()) {
				zip(temp, out, currentPath + File.separator);
			}
		} else {
			ZipEntry entry = new ZipEntry(currentPath);
			out.putNextEntry(entry);
			byte[] buffer = new byte[128];
			FileInputStream fis = new FileInputStream(sourceFile);
			BufferedInputStream bis = new BufferedInputStream(fis);
			int count = 0;
			while ((count = bis.read(buffer)) != -1) {
				out.write(buffer, 0, count);
			}
			bis.close();
		}
	}
}

 这里有点要注意的是,ZipEntry.isDirectory()方法,如果你在linux平台基本没有问题,但是如果在windows平台可能不好用。看看源码就知道了

 

 public boolean isDirectory()
    {
        return name.endsWith("/");
    }

 

 

 2.对流进行压缩和解压

JDK中提供了一下几个类来帮助我们对输入输出流进行解压和压缩

public class InflaterInputStream extends FilterInputStream
public class InflaterOutputStream extends FilterOutputStream
public class DeflaterInputStream extends FilterInputStream
public class DeflaterOutputStream extends FilterOutputStream

//看看他们的继承关系
public class DeflaterInputStream extends FilterInputStream
public class FilterInputStream extends InputStream

//看构造方法
 public DeflaterInputStream(InputStream inputstream)
    {
        this(inputstream, new Deflater());
        usesDefaultDeflater = true;
    }

protected FilterInputStream(InputStream inputstream)
    {
        in = inputstream;
    }
//装饰着模式,不用说都知道怎么用

 这里要注意的是,reset 和mark方法不能用,源代码为证

  public synchronized void mark(int i)
    {
    }

    public synchronized void reset()
        throws IOException
    {
        throw new IOException("mark/reset not supported");
    }

 最近看hadoop 源码的时候发现它实现了这个方法,刚兴趣的同学可以看看

org.apache.hadoop.io.compress.zlib.ZlibCompressor这个类

 

 

分享到:
评论

相关推荐

    JDK 压缩

    结合`jar`命令,开发人员可以在不编写Java代码的情况下对文件进行压缩和解压缩。 总之,JDK的压缩功能为Java开发者提供了强大且易于使用的工具,无论是处理ZIP格式还是GZIP格式的文件,都能轻松实现。了解并熟练...

    jdk-8u261-linux-x64.tar linux jdk

    下载解压即可 jdk-8u261-linux-x64.tarjdk-8u261-linux-x64.tarjdk-8u261-linux-x64.tar" 表明这是Java开发工具包的一个更新版本,特别是JDK 8 Update 261(8u261),并且提供的是一个可下载和解压缩的文件,用于在...

    jdk1.8 32位含jai_imageio支持

    Java Development Kit (JDK) 是Java编程语言的核心组件,它包含了一...它不仅提供了基础的Java开发环境,还增强了图像处理能力,特别是对于医疗领域的开发者,能够在32位系统上流畅地进行DICOM文件的压缩和解压缩操作。

    hadoop3.3+jdk1.8.zip

    它在牺牲一定压缩比的情况下,换取更快的压缩和解压缩速度,这对于大数据处理的实时性和吞吐量至关重要。在Hadoop环境中,Snappy通常作为HDFS的数据块压缩算法,可以显著提高数据读写性能。 综上所述,"hadoop3.3+...

    支持中文的zip压缩解压

    在IT行业中,压缩和解压缩文件是常见的操作,特别是在数据传输和存储时。"支持中文的zip压缩解压"这个话题对于处理包含中文文件名或路径的文件集合尤其重要。在许多编程语言中,包括Java,处理中文字符可能会遇到...

    linux -jdk8.zip

    `tar`是打包和解压缩工具,`-zxvf`参数分别表示解压、使用gzip压缩格式和显示详细信息。 4. 解压后,你会看到一个名为`jdk1.8.0_211`的目录。为了全局使用JDK,我们需要配置环境变量。打开或创建`~/.bashrc`或`~/....

    Windows下构建JDK.pdf

    - cpio.exe、gawk.exe、basefile.exe、zip.exe、unzip.exe:这些工具用于管理文件压缩和解压缩,特别是在处理JDK构建过程中的相关文件。 6. 系统和系统工具: - procps:进程查看器,用于查看和管理系统资源。 -...

    Java带密码压缩zip与解压文件源码

    在Java编程环境中,处理压缩和解压缩文件是常见的任务,特别是在需要传输或存储大量数据时。Zip格式是一种广泛使用的压缩格式,它允许我们将多个文件打包成一个单一的ZIP文件,以便于管理和传输。本文将详细讲解如何...

    解决java压缩、解压缩含中文字符的文件或文件夹问题

    通过对JDK的java.util.zip下的ZipInputStream和ZipOutputStream类进行改造,彻底解决压缩和解压缩文件时的中文文件名乱码问题。 包含已大好的jar包,以及一个如何使用的Demo程序。

    jdk-8u181-linux-x64.tar.gz

    在Linux系统中,用户通常需要先使用`tar`命令解压文件,然后用`gzip`或`gunzip`来解压缩,或者直接使用`tar -zxvf`组合命令一步完成解压和解压缩。 安装`jdk-8u181-linux-x64.tar.gz`的步骤通常包括以下几个部分: ...

    java_zip.rar_java软件_压缩软件

    Java Zip压缩技术是Java平台上的一个关键特性,它允许开发者对文件进行压缩和解压缩操作。在Java中,`java.util.zip`包提供了处理ZIP文件格式的类和接口,包括`ZipOutputStream`用于创建ZIP文件,`ZipInputStream`...

    Hadoop源代码分析(四)

    这些类在写入或读取数据时自动处理压缩和解压缩,使得用户可以方便地在Hadoop的输入输出流中使用压缩功能。 此外,Hadoop的Block Compression特性允许在HDFS文件块级别进行压缩,进一步节省存储空间。`...

    利于apache提供的ant包压缩文件

    总结来说,Apache Ant是一个强大的构建工具,它提供了一种标准化的方式来管理Java项目的构建过程,包括压缩和解压缩文件。通过编写XML配置文件,开发者可以定制自己的构建流程,从而提高效率并减少手动错误。在给定...

    通过Java测试几种压缩算法的性能(附测试代码下载)

    它在许多Google项目中被广泛使用,因为它能够在保持相对良好的压缩效果的同时,提供快速的压缩和解压缩速度。 为了进行性能测试,作者选择了一个常见的、大型的输入文件,即JDK的JavaDoc文档。由于文件大小适中,且...

    Hadoop源码编译支持Snappy压缩教程

    1. **速度快**:Snappy的设计重点在于快速压缩和解压缩速度,这对于大量数据的实时处理非常重要。 2. **较低的CPU消耗**:与其他高压缩比的算法相比,Snappy在保持合理压缩比的同时,CPU消耗相对较低。 3. **易于...

    Red Hat 安装JDK与IntelliJ IDEA.pdf

    Red Hat 安装 JDK 与 IntelliJ IDEA 在本文中,我们将详细介绍如何在 Red Hat 系统中安装 JDK ...通过使用 YUM 工具和解压缩安装包,我们可以轻松地安装和配置 JDK 和 IntelliJ IDEA,从而开始我们的 Java 开发之旅。

    JAVA 压缩解压AES

    在Java编程语言中,压缩和解压缩文件是常见的任务,特别是在数据存储和传输时。而AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,用于保护数据的安全性。本篇文章将详细探讨如何在Java中实现...

    文件的压缩与解压huffman算法功能实现.pdf

    - 选择操作方案:提供压缩和解压缩两种操作模式供用户选择。 - 其他辅助功能:可能包括文件预览、进度显示、错误处理等,以增强用户体验和系统稳定性。 Huffman算法的实现涉及到字符频率统计、树结构构建、编码...

    jdk-8u171-linux-x64.tar.gz.zip

    7-Zip是一款免费且功能强大的压缩和解压缩软件,支持多种文件格式,包括`.zip`。在7-Zip中打开文件,选择解压到一个合适的目录,例如`C:\Java\`。 解压完成后,你会得到一个名为`jdk-8u171-linux-x64.tar.gz`的文件...

Global site tag (gtag.js) - Google Analytics