Java压缩

在最近的项目中,我们不得不做一些我个人从未真正看过的事情。 压缩。 我们需要拍几个文件和图像,将它们压缩并提供给FTP使用,是的,总有一天,感觉确实回到了90年代。 除了过去的FTP之行外,它还是一个很好的机会,可以花一点时间在这个问题上。

压缩档案

因此,在通常的IO类BufferedInputStream , FileOutputStream和File上面有:

  • ZipInputStream –输入流,用于读取ZIP文件格式的文件。 与ZipFile不同,不缓存Zip条目。
  • ZipOutputStream –用于以ZIP文件格式写入文件的输出流。 这有一个默认的内部缓冲区512,可以使用BufferedOutputStream来增加它。
  • ZipEntry –表示一个zip文件中的条目。
  • ZipFile –用于从zip文件读取条目。 条目被缓存。
  • CRC32 –用于计算数据流的CRC-32。

下面的示例显示了如何在有和没有校验和的情况下压缩和解压缩文件夹中的文件:

package javaitzen.blog;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.zip.CRC32;
import java.util.zip.CheckedInputStream;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;/*** The Class FileCompressionUtil.*/
public class FileCompressionUtil {private static final String PATH_SEP = "\\";public static final int BUFFER = 2048;private FileCompressionUtil() {}/*** Zip files in path.* * @param zipFileName the zip file name* @param filePath the file path* @throws IOException Signals that an I/O exception has occurred.*/public static void zipFilesInPath(final String zipFileName, final String filePath) throws IOException {final FileOutputStream dest = new FileOutputStream(zipFileName);final ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest));try {byte[] data = new byte[BUFFER];final File folder = new File(filePath);final List< String > files = Arrays.asList(folder.list());for (String file : files) {final FileInputStream fi = new FileInputStream(filePath + PATH_SEP + file);final BufferedInputStream origin = new BufferedInputStream(fi, BUFFER);out.putNextEntry(new ZipEntry(file));int count;while ((count = origin.read(data, 0, BUFFER)) != -1) {out.write(data, 0, count);}origin.close();fi.close();}} finally {out.close();dest.close();}}/*** Zip with checksum. CRC32* * @param zipFileName the zip file name* @param folderPath the folder path* @return the checksum* @throws IOException Signals that an I/O exception has occurred.*/public static long zipFilesInPathWithChecksum(final String zipFileName, final String folderPath) throws IOException {final FileOutputStream dest = new FileOutputStream(zipFileName);final CheckedOutputStream checkStream = new CheckedOutputStream(dest, new CRC32());final ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(checkStream));try {byte[] data = new byte[BUFFER];final File folder = new File(folderPath);final List< String > files = Arrays.asList(folder.list());for (String file : files) {final FileInputStream fi = new FileInputStream(folderPath + PATH_SEP + file);final BufferedInputStream origin = new BufferedInputStream(fi, BUFFER);out.putNextEntry(new ZipEntry(file));int count;while ((count = origin.read(data, 0, BUFFER)) != -1) {out.write(data, 0, count);}origin.close();}} finally {out.close();checkStream.close();dest.flush();dest.close();}return checkStream.getChecksum().getValue();}/*** Unzip files to path.* * @param zipFileName the zip file name* @param fileExtractPath the file extract path* @throws IOException Signals that an I/O exception has occurred.*/public static void unzipFilesToPath(final String zipFileName, final String fileExtractPath) throws IOException {final FileInputStream fis = new FileInputStream(zipFileName);final ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));try {ZipEntry entry;while ((entry = zis.getNextEntry()) != null) {int count;byte[] data = new byte[BUFFER];final FileOutputStream fos = new FileOutputStream(fileExtractPath + PATH_SEP + entry.getName());final BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER);while ((count = zis.read(data, 0, BUFFER)) != -1) {dest.write(data, 0, count);}dest.flush();dest.close();}} finally {fis.close();zis.close();}}/*** Unzip files to path with checksum. CRC32* * @param zipFileName the zip file name* @param fileExtractPath the file extract path* @param checksum the checksum* @return true, if checksum matches;* @throws IOException Signals that an I/O exception has occurred.*/public static boolean unzipFilesToPathWithChecksum(final String zipFileName, final String fileExtractPath, final long checksum) throws IOException {boolean checksumMatches = false;final FileInputStream fis = new FileInputStream(zipFileName);final CheckedInputStream checkStream = new CheckedInputStream(fis, new CRC32());final ZipInputStream zis = new ZipInputStream(new BufferedInputStream(checkStream));try {ZipEntry entry = null;while ((entry = zis.getNextEntry()) != null) {int count;byte[] data = new byte[BUFFER];final FileOutputStream fos = new FileOutputStream(fileExtractPath + PATH_SEP + entry.getName());final BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER);while ((count = zis.read(data, 0, BUFFER)) != -1) {dest.write(data, 0, count);}dest.flush();dest.close();}} finally {zis.close();fis.close();checkStream.close();}if(checkStream.getChecksum().getValue() == checksum) {checksumMatches = true;}return checksumMatches;}}

压缩物件

我们最终没有使用对象压缩,但无论如何我还是看了一下。 我做了一些通用的compress / expand util,不知道它是否有用。 我将输入参数保留为OutputStream和InputStream,因为从理论上讲,它可以与从套接字通信到字符串处理的任何流实现一起使用。

这里使用与压缩相关的类:

  • GZIPInputStream –一个输入流过滤器,用于读取GZIP文件格式的压缩数据。
  • GZIPOutputStream –输出流过滤器,用于以GZIP文件格式写入压缩数据。
  • 默认内部缓冲区为512,如果需要更多,请使用BufferedOutputStream 。
package javaitzen.blog;import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;/*** The Class ObjectCompressionUtil.* * @param <T> the generic type of the serializable object to be compressed*/
public class ObjectCompressionUtil<T extends Serializable> {/*** Compress object.* * @param objectToCompress the object to compress* @param outstream the outstream* @return the compressed object* @throws IOException Signals that an I/O exception has occurred.*/public T compressObject(final T objectToCompress, final OutputStream outstream) throws IOException {final GZIPOutputStream gz = new GZIPOutputStream(outstream);final ObjectOutputStream oos = new ObjectOutputStream(gz);try {oos.writeObject(objectToCompress);oos.flush();return objectToCompress;}finally {oos.close();outstream.close();}}/*** Expand object.* * @param objectToExpand the object to expand* @param instream the instream* @return the expanded object* @throws IOException Signals that an I/O exception has occurred.* @throws ClassNotFoundException the class not found exception*/public T expandObject(final T objectToExpand, final InputStream instream) throws IOException,ClassNotFoundException {final GZIPInputStream gs = new GZIPInputStream(instream);final ObjectInputStream ois = new ObjectInputStream(gs);try {@SuppressWarnings("unchecked")T expandedObject = (T) ois.readObject();return expandedObject;} finally {gs.close();ois.close();}}}

参考:来自Zen的 JCG合作伙伴 Brian的Java压缩 技术 。

编码愉快!

拜伦

相关文章 :
  • Cajo,用Java完成分布式计算的最简单方法
  • Hibernate映射集合性能问题
  • Java Code Geeks Andygene Web原型
  • Servlet 3.0异步处理可将服务器吞吐量提高十倍

翻译自: https://www.javacodegeeks.com/2011/05/java-compression.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苏州面对公司发布

假设您对我们这种创业型公司和我们的发展方向感兴趣的话&#xff0c;我们希望通过以下10个问答进一步添加两方的了解。我们希望看到的是您经过深思熟虑的、对公司和自己的前途负责任的谨慎回答。而不是应付公差式的轻描淡写&#xff08;我们会依据您回答质量的高低决定是否邀请…

linux多线程_Java+Linux,深入内核源码讲解多线程之进程

之前写了两篇文章&#xff0c;都是针对Linux这个系统的&#xff0c;为什么?我为什么这么喜欢写这个系统的知识&#xff0c;可能就是为了今天的内容多线程系列&#xff0c;现在多线程不是一个面试重点 啊&#xff0c;那如果你能深入系统内核回答这个知识点&#xff0c;面试官会…

594. 最长和谐子序列

和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 现在&#xff0c;给你一个整数数组 nums &#xff0c;请你在所有可能的子序列中找到最长的和谐子序列的长度。 数组的子序列是一个由数组派生出来的序列&#xff0c;它可以通过删除一些元素或不删除元素、…

解决git clone报错SSL certificate problem

Git新手一枚&#xff0c;今天进行git clone操作时发生如下问题&#xff1a;提示无效的链接error: SSL certificate problem: Invalid certificate chain while accessing https://githib.com/...XXXX.git fatal: HTTP request failed解决方法也很简单&#xff0c;一条命令就搞定…

使用内存映射文件获取巨大的矩阵

总览 矩阵可能真的很大&#xff0c;有时甚至比一个数组中可以容纳的更大。 您可以通过具有多个数组来扩展最大大小&#xff0c;但这会使堆大小确实很大且效率低下。 一种替代方法是在内存映射文件上使用包装器。 内存映射文件的优点是它们对堆的影响很小&#xff0c;并且可以由…

ipad连接电脑_这些应用让iPad生产力分分钟UP

IT时报见习记者 钱奕昀用iPad办公这件事&#xff0c;多年前网友就在讨论&#xff0c;最常见的还是那句“买前生产力&#xff0c;买后爱奇艺”。很长一段时间里&#xff0c;它的生产力属性都是弱于娱乐属性的。其实&#xff0c;作为PC端和移动端的形态中和&#xff0c;iPad可以…

Mac OSX 快捷键命令行

ctrlshift 快速放大dock的图标会暂时放大&#xff0c;而如果你开启了dock放大CommandOptionW 将所有窗口关闭CommandW 将当前窗口关闭(可以关闭Safari标签栏,很实用) CommandOptionM …

将JavaFX 2.0与Swing和SWT集成

JavaFX 2.0对JavaFX的改进之一是可以更轻松地与Swing和SWT进行互操作 。 一些在线资源记录了如何完成此操作。 其中包括将JavaFX集成到Swing应用程序和SWT Interop中 。 但是&#xff0c;在有效的类级Javadoc文档的一个很好的示例中&#xff0c;各自的JavaFX类javafx.embed.swi…

iOS-如何返回某个字符串的拼音助记码

我也是看了网上的一个示例代码后&#xff0c;在它的基础上进行的修改。因为项目上会用到&#xff0c;我相信很多人的项目上也会用到。所以实现后&#xff0c;也赶紧分享出来&#xff0c;希望后来人不需要花费时间了。 提示&#xff1a;这里用到了正则表达式&#xff0c;使用了一…

wifi rssi 计算 距离_WiFi和WLAN是一样的?真相在这里~别再傻傻分不清了

我们通常上网的时候会说连接WiFi如果注意到无线网络的名称就会发现手机的连接显示是WLAN别再将WiFI和WLAN搞混了&#xff01;二者的定义WLANWLAN的全称为 Wireless Local Area Networks,中文意思为无线局域网络&#xff0c;是一种数据传输系统。它是利用射频技术进行数据传输&a…

【Shell剧本练习】得出的结论是当前用户

推断是否当前用户root。假设是暗示root用户&#xff0c;假设而不是提示对于普通用户#!/bin/bash #title: testus.sh #author: orangleliu #date: 2014-08-09 #desc: get current user, if it is root user, tell us it is super user or tell us is a common user# #Function C…

播放框架模块:分而治之

通常情况是您开始开发应用程序并继续满足要求。 当您的应用程序变得更大时&#xff0c;您开始意识到将其分为不同组件的便利。 而且&#xff0c;当您开发第二个或第三个应用程序时&#xff0c;您开始认识到可以在不同应用程序之间重用的某些功能。 这是模块化应用程序的两个很好…

Alpha阶段项目总结

1.我们的软件要解决什么问题&#xff1f;是否定义得很清楚&#xff1f;是否对典型用户和典型场景有清晰的描述&#xff1f; 我们的软件是一款针对健康饮食而做的一款饮食健康软件&#xff0c;对生活中我们经常迟到的很多事物组合都进行了详细的注解&#xff0c;用户可以清楚地看…

实用的it知识学习_怎样能更快更好的学习好书法?分享一些比较实用的理论知识...

如何能更快更高效的学习书法&#xff1f;首先了解一些书法理论知识是很有必要的&#xff01;它能让你在学习书法的过程中不至于迷茫 &#xff01;能助你更快学好书法&#xff01;一、书论在实践中产生我们大部分人都觉得学习书法可以没有理论&#xff0c;但不可无技法。但理论和…

九度oj-1001-Java

题目描述&#xff1a; This time, you are supposed to find AB where A and B are two matrices, and then count the number of zero rows and columns. 输入&#xff1a; The input consists of several test cases, each starts with a pair of positive integers M and N …

字节流与字符流的区别

最近在项目中遇到一个encoding的问题&#xff0c;记录一下。 具体而言就是&#xff0c;项目中有A/B两个部分&#xff0c;A部分由我们负责&#xff0c;Java实现&#xff1b;B部分是UK负责的&#xff0c;使用Delphi&#xff0c;A、B在交互时发送一个http请求&#xff0c; 请求汇总…

通过MOXy实现使JAXB更加清洁

编组和解组XML时使用JAXB的主要优点是编程模型。 只需注释几个POJO并使用JAXB API&#xff0c;您就可以很容易地序列化为XML和从XML反序列化。 您无需担心有关XML如何编组/解组的细节。 一切都比DOM和SAX等替代方案简单得多。 现在&#xff0c;XML文件中的数据本质上趋于分层。…

android 上下滚动文字_计算机毕设项目004之Android系统在线小说阅读器

计算机毕设项目004之Android系统在线小说阅读器一. 项目名称基于Android系统的在线小说阅读器二. 项目简介项目中的角色功能&#xff1a;支持翻页动画:仿真翻页、覆盖翻页、上下滚动翻页等翻页效果。支持页面定制:亮度调节、背景调节、字体大小调节支持全屏模式(含有虚拟按键的…

697. 数组的度

给定一个非空且只包含非负数的整数数组 nums&#xff0c;数组的 度 的定义是指数组里任一元素出现频数的最大值。 你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组&#xff0c;返回其长度。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&a…

python math模块

1.math简介 >>> import math >>>dir(math) #这句可查看所有函数名列表 [__doc__, __name__, __package__, acos, acosh, asin, asinh, atan, atan2, atanh, ceil, copysign, cos, cosh, degrees, e, erf, erfc, exp, expm1, fabs, factorial, flo…