`

Java压缩/解压缩二进制文件

阅读更多

在Java中提供DeflaterInflater工具类来压缩/解压缩数据。 这两个工具类采用zlib算法,下面给出一个封装好的工具。

package com.lifeiflong.io;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.DataFormatException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;


/**
 * util for compress/decompress data
 * Java压缩/解压缩二进制文件
 * 在Java中提供Deflater和Inflater工具类来压缩/解压缩数据。 这两个工具类采用zlib算法
 */
public final class CompressionUtil {
	
	/**
	 * Compression level
	 */
	private static enum Level {

		/**
		 * Compression level for no compression.
		 */
		NO_COMPRESSION(0),

		/**
		 * Compression level for fastest compression.
		 */
		BEST_SPEED(1),

		/**
		 * Compression level for best compression.
		 */
		BEST_COMPRESSION(9),

		/**
		 * Default compression level.
		 */
		DEFAULT_COMPRESSION(-1);

		private int level;

		Level(

		int level) {
			this.level = level;
		}

		public int getLevel() {
			return level;
		}
	}

	private static final int BUFFER_SIZE = 4 * 1024;

	public static byte[] compress(byte[] data, Level level) throws IOException {

		Deflater deflater = new Deflater();
		// set compression level
		deflater.setLevel(level.getLevel());
		deflater.setInput(data);

		ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);

		deflater.finish();
		byte[] buffer = new byte[BUFFER_SIZE];
		while (!deflater.finished()) {
			int count = deflater.deflate(buffer); // returns the generated code... index
			outputStream.write(buffer, 0, count);
		}
		byte[] output = outputStream.toByteArray();
		outputStream.close();
		return output;
	}

	public static byte[] decompress(byte[] data) throws IOException,
			DataFormatException {
		Inflater inflater = new Inflater();
		inflater.setInput(data);

		ByteArrayOutputStream outputStream = new ByteArrayOutputStream(
				data.length);
		byte[] buffer = new byte[BUFFER_SIZE];
		while (!inflater.finished()) {
			int count = inflater.inflate(buffer);
			outputStream.write(buffer, 0, count);
		}
		byte[] output = outputStream.toByteArray();
		outputStream.close();
		return output;
	}

	

	public static void testCompress() throws Exception {

		BufferedInputStream in = new BufferedInputStream(new FileInputStream(
				"E:\\myerp_error.log"));
		ByteArrayOutputStream out = new ByteArrayOutputStream(1024);

		byte[] temp = new byte[1024];
		int size = 0;
		while ((size = in.read(temp)) != -1) {
			out.write(temp, 0, size);
		}
		in.close();
		byte[] data = out.toByteArray();
		byte[] output = CompressionUtil.compress(data,
				CompressionUtil.Level.BEST_COMPRESSION);
		System.out.println("before : " + (data.length / 1024) + "k");
		System.out.println("after : " + (output.length / 1024) + "k");

		FileOutputStream fos = new FileOutputStream(
				"E:\\myerp_error_compress.log");
		fos.write(output);
		out.close();
		fos.close();
	}

	public static void testDecompress() throws Exception {

		BufferedInputStream in = new BufferedInputStream(new FileInputStream(
				"E:\\myerp_error_compress.log"));
		ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
		byte[] temp = new byte[1024];
		int size = 0;
		while ((size = in.read(temp)) != -1) {
			out.write(temp, 0, size);
		}
		in.close();
		byte[] data = out.toByteArray();
		byte[] output = CompressionUtil.decompress(data);
		System.out.println("before : " + (data.length / 1024) + "k");
		System.out.println("after : " + (output.length / 1024) + "k");

		FileOutputStream fos = new FileOutputStream(
				"E:\\myerp_error_decompress.log");
		fos.write(output);
		out.close();
		fos.close();
	}
	
	
	public static void main(String[] args) throws Exception {
//		testCompress();
		testDecompress();
	}
}

 

 

 关于OutOfMemoryError,请参考:http://www.devguli.com/blog/eng/java-deflater-and-outofmemoryerror/

 

分享到:
评论

相关推荐

    Hyperledger Fabric linux二进制文件

    2. **安装步骤**:首先,将RAR文件解压缩到Linux环境中,通常是在用户目录或指定的工作目录下。然后,设置环境变量,如FABRIC_CFG_PATH指向配置文件目录,将bin和lib目录添加到PATH环境变量中,以便系统能找到执行...

    二进制与字符串之间的转换类CBinary

    5. **数据压缩与解压缩**:为了节省存储空间或提高传输效率,二进制数据可能需要进行压缩。`CBinary`可能集成了常见的压缩算法,如gzip或lz4,允许用户对二进制数据进行压缩和解压缩。 6. **数据加密与解密**:为了...

    哈夫曼编码实现压缩解压缩java

    - 解压缩时,同样需要从文件读取二进制数据,`FileInputStream`和`BufferedInputStream`可帮助完成这个任务。 综上所述,哈夫曼编码是通过构建特定的哈夫曼树,根据字符出现频率生成二进制编码,以此实现数据压缩...

    二进制打包解包

    二进制打包是将源代码或者程序转换为可执行的二进制文件,以便在计算机上运行。解包则是相反的过程,即从二进制格式还原出原始的数据或代码。这个过程对于理解和操作软件及其数据至关重要。 二进制打包的目的是为了...

    Huffman 压缩解压缩 Java实现

    需要注意的是,Java实现的Huffman压缩解压缩不适用于二进制文件,因为二进制文件的字节分布与ASCII文档不同,直接应用ASCII字符频率统计可能会导致压缩效果不佳。对于二进制文件,通常需要先进行预处理,如使用字节...

    基于JAVA的文件压缩与解压缩工具设计与实现

    在Java编程语言中,设计和实现一个文件压缩与解压缩工具涉及到多个核心概念和技术。首先,我们需要理解文件I/O操作,这是任何文件处理程序的基础。Java提供了`java.io`包,其中包含各种类用于读写文件,如`File`, `...

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

    6. **毕业设计**:对于计算机科学的学生来说,这样的毕业设计有助于提升实际编程技能,理解文件系统的操作,以及如何利用Java处理二进制数据和文件流。同时,通过编写论文,学生可以学习到如何系统地描述和解释技术...

    jdk8 解压缩安装包下载地址https://www.oracle.com/java/technologies/download

    1. **下载JDK8**:访问官方下载链接,根据你的Linux发行版选择对应的二进制文件,通常为`.tar.gz`格式。 2. **解压JDK8**:下载完成后,将文件移动到你需要安装的目录,例如 `/opt`,然后使用以下命令解压缩: ``...

    [计算机项目]基于java的文件压缩与解压缩系统设计与实现(源代码+项目报告).zip

    BufferedReader和BufferedWriter可以用来分块读写文本文件,而字节数组缓冲区(ByteBuffer)可用于二进制文件。 8. **异常处理**: 在文件操作中,可能出现各种异常,如FileNotFoundException、IOException等。...

    对于任意一个文件进行压缩,压缩后的文件名为原文件名称去掉后缀加上.hz,例如,原来的未压缩文件的名字为a.txt,压缩后为a.hz

    (c) 压缩内容不再是文本字符数据,而是任意二进制文件,请压缩附件中的“全球变暖的公益广告视频”(qqbn_gygg.flv)。 注意:(a) 先假设压缩的文件的长度都不大,不考虑效率问题,可以使用缓存。 (b) 以前的霍夫曼...

    玉照写出到图形文件二进制数据流读取文件

    "玉照写出到图形文件二进制数据流读取文件"这个标题暗示了我们要讨论的是如何将图像(玉照)转换为二进制数据流,并进行读取和写入到图形文件的过程。下面我们将深入探讨这一主题。 首先,我们需要理解图片的基本...

    基于linux下:jdk-1.8.0二进制安装包

    将下载的JDK二进制包解压缩到刚创建的目录中。假设你的二进制包在当前用户的下载目录中: ``` sudo tar -zxf ~/Downloads/jdk-1.8.0_linux-x64_bin.tar.gz -C /usr/lib/jvm/jdk1.8.0_00/ ``` 3. **配置环境变量...

    java实现上传文件类型检测过程解析

    在 Java 中,可以使用 FileInputStream 读取文件的二进制数据,并将其转换为十六进制字符串。然后,使用 HashMap 缓存文件头信息,通过文件头信息来判断文件的真正类型。 以下是 Java 实现上传文件类型检测过程解析...

    Java带密码解压缩RAR压缩包(内附代码)

    文件名`java-unrar_gnu-crypto`可能就是这个库的源代码或者二进制包。 要使用`java-unrar`库,首先将其添加到你的项目依赖中。如果是Maven项目,可以在pom.xml文件中添加如下依赖: ```xml <groupId>de....

    bitmap或者png转.rgba二进制文件

    `bitmap`和`png`是两种常见的图像格式,而将它们转换为`.rgba`二进制文件则涉及到图像数据的处理和理解。`.rgba`文件通常指的是包含红、绿、蓝和透明度(Alpha)通道的原始像素数据,这种格式在进行图像处理和渲染时...

    java哈夫曼编码,压缩,解压缩

    - 然后,遍历压缩后的二进制字符串,按照哈夫曼编码表还原出原来的字符,得到解压缩后的文本。 在描述中提到,这个项目包含了一个带有界面的Java应用,可以实现哈夫曼编码的压缩和解压缩功能。这意味着它可能包括...

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

    Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean...JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。

    整数可变字节的压缩算法

    3. 返回生成的字节数组,这就是整数序列的压缩二进制流。 在`test1.java`文件中,很可能包含了具体的实现代码。通常,这样的代码会包含类、方法和循环结构,用于处理整数序列和字节流。例如,可能会有一个`...

    Huffman 霍夫曼 无损压缩 算法实现 java

    - 将替换后的二进制序列写入文件,可以以二进制格式存储,例如`.huff`文件。 4. **解压缩过程:** - 读取`.huff`文件,按照霍夫曼编码表反向操作,将二进制序列还原为原始字符。 - 由于霍夫曼编码是无损的,解...

    OpenJDK 二进制安装

    2. **解压文件**:使用解压缩软件(如WinRAR或7-Zip)打开`openjdk-18.0.2_windows-x64_bin.zip`,将其解压到一个你选择的目录,比如`C:\Program Files\OpenJDK`。 3. **设置环境变量**: - 打开系统属性,选择...

Global site tag (gtag.js) - Google Analytics