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

java压缩

java压缩_Java压缩相关推荐

  1. java生成unix.z压缩_JAVA压缩 解压缩zip 并解决linux下中文乱码

    1:再压缩前,要设置linux模式, 需要使用第三方ant-1.6.5.jar 如果是文件目录,则 ZipEntry zipEntry=new ZipEntry(basePath + System.g ...

  2. java 视频压缩_Java 压缩视频(无需安装插件)

    亲测可用,基于ffmpeg 去进行压缩, 测试原视频大小:835.87 MB 压缩后大小:118.8 MB 压缩比率 :85.78% 好了,开始上代码 1.首先 pom文件中引入下面两个 jar 包 ...

  3. gzip java 压缩_Java压缩技术(四) GZIP——Java原生实现

    熟悉linux的朋友可能都用过文件压缩命令,譬如最为简单的gzip命令. 相关链接: Java压缩技术(一) ZLib Java压缩技术(二) ZIP压缩--Java原生实现 Java压缩技术(三) ...

  4. java byte 压缩_java压缩和解压字符串,Byte数组,String

    /*** * 压缩GZip * *@paramdata *@return */ public static byte[] gZip(byte[] data) {byte[] b = null;try{ ...

  5. java音频压缩_java 压缩mp3 比特率

    下载:Xuggle_study(含xuggle jar).rar http://download.csdn.net/detail/shuzheng5201314/8711543 用.zip打开jar完 ...

  6. java 解压与压缩代码_Java实现多文件压缩和解压缩代码详解

    Java实现多文件压缩和解压缩代码 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStre ...

  7. java 压缩技术_Java压缩技术(三) ZIP解压缩——Java原生实现

    JavaEye的朋友跟我说:"你一口气把ZIP压缩和解压缩都写到一个帖子里,我看起来很累,不如分开好阅读".ok,面向读者需求,我做调整,这里单说ZIP解压缩! 相关链接: Jav ...

  8. java 文件压缩_java实现文件压缩

    java实现文件压缩:主要是流与流之间的传递 代码如下: package com.cst.klocwork.service.zip; import java.io.File; import java. ...

  9. java ant解压缩_java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解

    java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解 发布于 2020-4-7| 复制链接 摘记: java ant包中的org.apache.tools.zip实现 ...

最新文章

  1. android 如何解决scrollTo无法执行
  2. linux hadoop 本地,Linux系统下运行基于本地的Hadoop
  3. 《炉石传说》架构设计赏析(4):Asset管理
  4. 适用于应用程序错误的AWS警报
  5. 【转】建立公用程序库,提升软件开发生产力
  6. Docker精华问答 | 数据库为什么不适合放在 Docker 中运行?
  7. 服务器显示A40故障码,求助大神,车子出现故障码,5053无法消除
  8. FlexBuilder3安装集成eclipse
  9. ROBOMASTER机甲大师赛视觉组学习方案
  10. Docker 的LNMP + Wordpress搭建
  11. FastText文本分类以及生成词向量
  12. 六度分离_hdu_1869(floyd算法).java
  13. 【饭谈】那些看似为公司着想,实际却很自私的故事 (一:造轮子)
  14. 常用表格:ASCAII码对照表
  15. 最新Mac Pro详解
  16. 关于“马甲app”你不得不知的一些常识
  17. 中北大学算法分析与设计实验报告一(BF算法)
  18. 电脑计算机怎么用键盘计算,电脑计算器还能这么用?
  19. centos7解决hadoop2.6.4多次格式化导致的slaver节点datanode无法启动的问题
  20. GD32F310 (二) 按键轮询输入

热门文章

  1. 优秀学生专栏——李浩然
  2. 给定年月日计算是一年的第几天
  3. Spring IOC 如何解决循环依赖?
  4. selenium自动化测试_为什么在生产中进行Selenium自动化测试对于您的下一个版本至关重要?...
  5. aws ec2 选择可用区_AWS Messaging Services:选择合适的服务
  6. pbfunc外部扩展函数_从外部CorDapp扩展和覆盖流
  7. 如何在Java中处理ConcurrentModificationException? 在循环中从ArrayList中删除元素时要当心...
  8. c++返回指针时候注意提防_提防Java中的函数式编程!
  9. java处理注释_Java注释处理器
  10. 自定义ui_如何允许用户自定义UI