在Java中提供Deflater和Inflater工具类来压缩/解压缩数据。 这两个工具类采用zlib算法,下面给出一个封装好的工具。
/** * util for compress/decompress data * * @author lichengwu * @version 1.0 * @created 2013-02-07 10:14 AM */ public final class CompressionUtil { private static final int BUFFER_SIZE = 4 * 1024; /** * compress data by {@linkplain Level} * * @author lichengwu * @created 2013-02-07 * * @param data * @param level * see {@link Level} * @return * @throws IOException */ public static byte[] compress(byte[] data, Level level) throws IOException { Assert.notNull(data); Assert.notNull(level); 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; } /** * decompress data * * @author lichengwu * @created 2013-02-07 * * @param data * @return * @throws IOException * @throws DataFormatException */ public static byte[] decompress(byte[] data) throws IOException, DataFormatException { Assert.notNull(data); 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; } /** * Compression level */ public 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; } } }
下面是一个测试:
@Test public void testCompress() throws Exception { BufferedInputStream in = new BufferedInputStream(new FileInputStream( "/Users/lichengwu/tmp/out_put.txt.bak")); 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("/Users/lichengwu/tmp/out_put.txt.bak.compress"); fos.write(output); out.close(); fos.close(); } @Test public void testDecompress() throws Exception { BufferedInputStream in = new BufferedInputStream(new FileInputStream( "/Users/lichengwu/tmp/out_put.txt.bak.compress")); 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("/Users/lichengwu/tmp/out_put.txt.bak.decompress"); fos.write(output); out.close(); fos.close(); }
关于OutOfMemoryError,请参考:http://www.devguli.com/blog/eng/java-deflater-and-outofmemoryerror/
相关推荐
使用Java 语言实现了Huffman编码的压缩和解压缩,能够实现对Ascii 文档的压缩和解压缩,目前尚不支持对二进制文档进行压缩
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean...JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
LZW解压缩、JAVA2D、音频和视频截取、媒体播放器的实现文档...忘了上传了,不好意思
(c) 压缩内容不再是文本字符数据,而是任意二进制文件,请压缩附件中的“全球变暖的公益广告视频”(qqbn_gygg.flv)。 注意:(a) 先假设压缩的文件的长度都不大,不考虑效率问题,可以使用缓存。 (b) 以前的霍夫曼...
3. 根据 Huffman 树为每个像素值赋予一个可变长度的二进制编码 4. 使用上一步得到的编码对原始图像进行编码 5. 对编码后的位串进行填充,确保长度是 8 的倍数 6. 将编码后的位串转换为字节序列写入压缩文件 解压原理...
可在 Windows XP, Windows 2003, Windows Vista, Windows 7, Windows 8 , Windows 8.1 and Windows 10 中运行, 反编译Java 重构从原始的源代码已编译的二进制CLASS文件. 是能够反编译复杂的 Java 小程序和二进制...
它生成一个二进制文件,可以使用同一工具将其解压缩为原始文件。 不久将添加更多字符集,也许还会支持不同的文件类型。 用法: java -jar HuffmanCoding.jar [option] < input_file > 选项: [-e]编码 [-...
/** * 根据 策划的配置表来生成 json * excel 目前使用的版本为2007,其他版本未测试, * excel 格式 定义 ... * 二进制的方式,一般用于 后台管理界面 的文件上传后的处理。 * @author wgq * */
运行程序之后输入任意的字符串,将字符串转化成二进制数字字符串,然后利用LZ78算法实现对二进制字符串压缩解压,最后再恢复原来的字符串
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
通过解压缩/转换导出的二进制vCO软件包,将XML格式的vCO内容源代码发布到远程版本控制存储库。 注意此集成工具的当前版本仅处理vCO软件包。 为了发布,必须首先创建vCO软件包,其中包括所有需要的内容。 2.前提...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...
libjpeg-turbo 是一种 JPEG 图像编解码器,它使用 SIMD 指令加速 x86、...为流行的 Linux 发行版、Windows、OS X 和 iOS 提供 32 位和 64 位二进制文件 提供行业标准 libjpeg API/ABI(可模拟 libjpeg v6b、v7 或 v8 )
首先下载一个二进制文件或按照上述方法构建二进制文件并解压缩它。 运行程序使用 bin/segment 脚本。 例如在 Linux 上,从主项目目录执行: bin/segment 在 Windows 上,从主目录,它看起来像这样: bin\segment 当...
将.tar.gz存档二进制文件移动到当前目录。 解压缩tarball并通过发出以下命令来安装Java: tar zxvf jre-8u73-linux-i586.tar.gz Java文件安装在当前目录中的名为jre1.8.0_73的目录中。 在此示例中,它安装在/usr/...
CSMatIO使用ZLIB.NET(ZLIB库的托管版本)来压缩/解压缩MAT文件内容。 ZLIB.NET是ComponentAce()提供的开源。 从CSMatIO修订版13开始,如果使用.NET Framework 4.0或更高版本,则不再需要ZLIB.NET。 有关许可证...
此功能可以加载压缩、RLE 编码或未压缩的二进制 3D amira 图像和标签文件。 支持所有数据类型。 解压缩例程是Michael Kleder在2005年11月对zlib实现进行的修改。请确保增加Java堆大小以加载到大型zlib压缩文件中(请...
Ghidra2矮人 灵感来源: 欢迎捐款,如果有任何问题...解压缩。 在脚本管理器->脚本目录中,添加提取的目录: 跑步 在脚本管理器中运行ghidra2dwarf.py : 无头模式 此模式仅适用于目前的ghidra 9.1.2 Linux 如果
matlab解压代码用于解压缩并随后从文件中读取加速度的 Java 类。 基于 Jan Brond's 的一个叉子。 我没有在他的代码中找到许可通知,因此我假设 Creative Commons BY license () 也适用于这个项目。 COMPILE 使用 ...