在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/
相关推荐
2. **安装步骤**:首先,将RAR文件解压缩到Linux环境中,通常是在用户目录或指定的工作目录下。然后,设置环境变量,如FABRIC_CFG_PATH指向配置文件目录,将bin和lib目录添加到PATH环境变量中,以便系统能找到执行...
5. **数据压缩与解压缩**:为了节省存储空间或提高传输效率,二进制数据可能需要进行压缩。`CBinary`可能集成了常见的压缩算法,如gzip或lz4,允许用户对二进制数据进行压缩和解压缩。 6. **数据加密与解密**:为了...
- 解压缩时,同样需要从文件读取二进制数据,`FileInputStream`和`BufferedInputStream`可帮助完成这个任务。 综上所述,哈夫曼编码是通过构建特定的哈夫曼树,根据字符出现频率生成二进制编码,以此实现数据压缩...
二进制打包是将源代码或者程序转换为可执行的二进制文件,以便在计算机上运行。解包则是相反的过程,即从二进制格式还原出原始的数据或代码。这个过程对于理解和操作软件及其数据至关重要。 二进制打包的目的是为了...
需要注意的是,Java实现的Huffman压缩解压缩不适用于二进制文件,因为二进制文件的字节分布与ASCII文档不同,直接应用ASCII字符频率统计可能会导致压缩效果不佳。对于二进制文件,通常需要先进行预处理,如使用字节...
在Java编程语言中,设计和实现一个文件压缩与解压缩工具涉及到多个核心概念和技术。首先,我们需要理解文件I/O操作,这是任何文件处理程序的基础。Java提供了`java.io`包,其中包含各种类用于读写文件,如`File`, `...
6. **毕业设计**:对于计算机科学的学生来说,这样的毕业设计有助于提升实际编程技能,理解文件系统的操作,以及如何利用Java处理二进制数据和文件流。同时,通过编写论文,学生可以学习到如何系统地描述和解释技术...
1. **下载JDK8**:访问官方下载链接,根据你的Linux发行版选择对应的二进制文件,通常为`.tar.gz`格式。 2. **解压JDK8**:下载完成后,将文件移动到你需要安装的目录,例如 `/opt`,然后使用以下命令解压缩: ``...
BufferedReader和BufferedWriter可以用来分块读写文本文件,而字节数组缓冲区(ByteBuffer)可用于二进制文件。 8. **异常处理**: 在文件操作中,可能出现各种异常,如FileNotFoundException、IOException等。...
(c) 压缩内容不再是文本字符数据,而是任意二进制文件,请压缩附件中的“全球变暖的公益广告视频”(qqbn_gygg.flv)。 注意:(a) 先假设压缩的文件的长度都不大,不考虑效率问题,可以使用缓存。 (b) 以前的霍夫曼...
"玉照写出到图形文件二进制数据流读取文件"这个标题暗示了我们要讨论的是如何将图像(玉照)转换为二进制数据流,并进行读取和写入到图形文件的过程。下面我们将深入探讨这一主题。 首先,我们需要理解图片的基本...
将下载的JDK二进制包解压缩到刚创建的目录中。假设你的二进制包在当前用户的下载目录中: ``` sudo tar -zxf ~/Downloads/jdk-1.8.0_linux-x64_bin.tar.gz -C /usr/lib/jvm/jdk1.8.0_00/ ``` 3. **配置环境变量...
在 Java 中,可以使用 FileInputStream 读取文件的二进制数据,并将其转换为十六进制字符串。然后,使用 HashMap 缓存文件头信息,通过文件头信息来判断文件的真正类型。 以下是 Java 实现上传文件类型检测过程解析...
文件名`java-unrar_gnu-crypto`可能就是这个库的源代码或者二进制包。 要使用`java-unrar`库,首先将其添加到你的项目依赖中。如果是Maven项目,可以在pom.xml文件中添加如下依赖: ```xml <groupId>de....
`bitmap`和`png`是两种常见的图像格式,而将它们转换为`.rgba`二进制文件则涉及到图像数据的处理和理解。`.rgba`文件通常指的是包含红、绿、蓝和透明度(Alpha)通道的原始像素数据,这种格式在进行图像处理和渲染时...
- 然后,遍历压缩后的二进制字符串,按照哈夫曼编码表还原出原来的字符,得到解压缩后的文本。 在描述中提到,这个项目包含了一个带有界面的Java应用,可以实现哈夫曼编码的压缩和解压缩功能。这意味着它可能包括...
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean...JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
3. 返回生成的字节数组,这就是整数序列的压缩二进制流。 在`test1.java`文件中,很可能包含了具体的实现代码。通常,这样的代码会包含类、方法和循环结构,用于处理整数序列和字节流。例如,可能会有一个`...
- 将替换后的二进制序列写入文件,可以以二进制格式存储,例如`.huff`文件。 4. **解压缩过程:** - 读取`.huff`文件,按照霍夫曼编码表反向操作,将二进制序列还原为原始字符。 - 由于霍夫曼编码是无损的,解...
2. **解压文件**:使用解压缩软件(如WinRAR或7-Zip)打开`openjdk-18.0.2_windows-x64_bin.zip`,将其解压到一个你选择的目录,比如`C:\Program Files\OpenJDK`。 3. **设置环境变量**: - 打开系统属性,选择...