我正在使用ZipOutputStream压缩一堆文件,这些文件是已压缩格式的混合,以及许多大型高度可压缩格式,如纯文本.

大多数已经压缩的格式都是大文件,因为它们永远不会变小,有时会在极少数情况下变得稍微大一些,因此在重新压缩它们时花费cpu和内存是没有意义的.

当我检测到预压缩文件时,我试图使用.setMethod(ZipEntry.STORED),但它抱怨我需要提供这些文件的大小,compressedSize和crc.

我可以使用以下方法使其工作,但这需要我读取文件两次.一旦计算CRC32然后再次实际将文件复制到ZipOutputStream中.

// code that determines the value of method omitted for brevity

if (STORED == method)

{

fze.setMethod(STORED);

fze.setCompressedSize(fe.attributes.size());

final HashingInputStream his = new HashingInputStream(Hashing.crc32(), fis);

ByteStreams.copy(his,ByteStreams.nullOutputStream());

fze.setCrc(his.hash().padToLong());

}

else

{

fze.setMethod(DEFLATED);

}

zos.putNextEntry(fze);

ByteStreams.copy(new FileInputStream(fe.path.toFile()), zos);

zos.closeEntry();

有没有办法提供这些信息而无需两次读取输入流?

最佳答案 简答:

我无法确定一种只读取文件一次的方法,并根据我必须解决此问题的时间用标准库计算CRC.

我确实找到了一个优化,平均减少了约50%的时间.

我预先计算要与ExecutorCompletionService同时存储的文件的CRC,该ExecutorCompletionService仅限于Runtime.getRuntime().availableProcessors()并等待它们完成.其有效性取决于需要CRC计算的文件数.随着文件越多,效益越大.

然后在.postVisitDirectories()中,在PipedOutputStream中围绕PipedOutputStream包装一个PipedOutputStream来运行临时线程,将ZipOutputStream转换为InputStream我可以传入HttpRequest将ZipOutputStream的结果上传到远程服务器连续编写所有预先计算的ZipEntry / Path对象.

这对于处理300 GB的即时需求来说已经足够了,但是当我完成10TB工作时,我将着眼于解决它并尝试找到更多优势而不会增加太多复杂性.

如果我想出一些明智的时间,我会用新的实现来更新这个答案.

答案很长:

我最后写了一个洁净室ZipOutputStream,支持多部分zip文件,智能压缩级别与STORE,并且能够在我读取时计算CRC,然后在流的末尾写出元数据.

为什么ZipOutputStream.setLevel()交换不起作用:

The ZipOutputStream.setLevel(NO_COMPRESSION/DEFAULT_COMPRESSION)

hack is not a viable approach. I did extensive tests on hundreds of

gigs of data, thousands of folders and files and the measurements were

conclusive. It gains nothing over calculating the CRC for the

STORED files vs compressing them at NO_COMPRESSION. It is actually

slower by a large margin!

In my tests the files are on a network mounted drive so reading

the files already compressed files twice over the network to

calculate the CRC then again to add to the ZipOutputStream was as

fast or faster than just processing all the files once as DEFLATED

and changing the .setLevel() on the ZipOutputStream.

There is no local filesystem caching going on with the network access.

This is a worse case scenario, processing files on the local disk will

be much much faster because of local filesystem caching.

So this hack is a naive approach and is based on false assumptions. It is processing the

data through the compression algorithm even at NO_COMPRESSION level

and the overhead is higher than reading the files twice.

java zipentry 压缩率_java – ZipEntry.STORED用于已经压缩的文件?相关推荐

  1. java zip 读取_java读取zip (含压缩包内的文件)

    ZIP是一种相当简单的分别压缩每个文件的存档格式.java中使用ZipFile.ZipInputStream快速读取或解压zip压缩包中的目录和文件. 完整示例:package com.weizhix ...

  2. 无摄像头java手机机型_java – 面部检测不适用于前置摄像头

    所以基本上我有这个代码,if(mCamera.getParameters().getMaxNumDetectedFaces()==0) { System.out.println("Face ...

  3. java文件名特殊字符_Java 8:用名字读取特殊字符的文件

    我试图在Linux系统上读取名称中包含特殊字符的文件.我对操作系统没有任何控制权. 我试过使用IO和NIO.我不断地 java.nio.file.invalidPathException:格式错误的输 ...

  4. java校验文件格式_java验证文件格式工具类(获取文件真实格式)

    , String>();privateVerifyFileType(){} static{ getAllFileType();//初始化文件类型信息} /*** Discription:[get ...

  5. java ssh文件下载_Java使用SSH从远程服务器下载文件

    前言 Telnet.FTP.POP3在网络传输的过程中都是采用明文,容易被监听或者遭到到man-in-the-middle的攻击方式攻击.而SSH为远程登陆会话和其他的网络服务提供安全协议,通过加密数 ...

  6. java 指定文件格式_java删除指定目录下指定格式文件的方法

    本文实例为大家分享了java删除指定目录下指定格式文件的具体代码,供大家参考,具体内容如下 正在看疯狂java讲义这本书,发现源码中有我不需要的class文件,想批量把它删除 代码如下: import ...

  7. java swing 导出文件_java swing (一) 导出excel文件并打开

    点击XXX管理系统中的"导出Excel"按钮,然后弹出如上图,点击"保存"以后,该Excel就保存到指定路径,并且打开. 上述的动作,其实不难,主要是打开该文件 ...

  8. java stdout库_Java重写StdOut并将日语写入文件

    我一直在尝试创建一个可以设置为标准输出并写入文件的类.到目前为止,没问题.但是,当我试图在输出中写入一些日语时,它不会显示在文件中.我只得到一行角色. 这就是OutputStream类的样子(我创建了 ...

  9. java获得当前路径_JAVA 取得当前目录的路径/Servlet/class/文件路径/web路径/url地址...

    在写java程序时不可避免要获取文件的路径...总结一下,遗漏的随时补上 1.可以在servlet的init方法里 String path = getServletContext().getRealP ...

  10. java不能安装_java环境安装之不能安装exe文件

    经过多年,打算再学下java 从官网下载java8安装包,但因为我的计算机的cd-room被卸载掉了,安装是报错说cab文件损坏之类的错误. 从stackOverflow中找到一篇眼前一亮的解决办法. ...

最新文章

  1. 如何团队协作,代码托管?Git使用教程:最详细、最浅显、一文读懂Git常用操作!...
  2. 大数据时代的数据管理
  3. 1月8日学习内容整理:JS的作用域和作用域链
  4. iOS:通过URL构件UIImage
  5. Java-数组的使用
  6. Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks -译文
  7. 【Paddle】实践作业——建立模型并测试100张图片
  8. python读取数据库数据,读取出的中文乱码问题
  9. Kruskal算法实现最小生成树MST(java)
  10. 华景机器人百度_qq群机器人凉了,晨风创始人被抓,酷Q停止运营!
  11. 【学习资源分享】在线学习平台推荐
  12. RFID银行钱箱资产管理系统
  13. 小程序步数解密php,微信小程序--获取微信运动步数的实例代码
  14. xbox蓝牙手柄驱动_如何通过蓝牙将Xbox One控制器连接到Windows
  15. win7系统ntp时间服务器,win7与内部ntp服务器同步时间出来错误【NTP时间同步服务器】...
  16. django自带模块实现翻页功能
  17. 入库出库JAVA技术详情_基于Java_EE的入库出库管理系统
  18. jquery插件zoom
  19. 为了庆祝五一国际劳动节的到来
  20. 玩转Ubuntu(磁盘管理工具GParted)

热门文章

  1. 我为什么选择了自然码?
  2. python小波去噪实验
  3. Mac野外动物高清动态桌面壁纸
  4. MATLAB 轮式机器人轨迹跟踪仿真
  5. 批量读取word docx文件指定表格内容,保存在excel文件中
  6. Serv-U FTP服务器安装带绿化版工具
  7. 黑苹果 OC (OpenCore) 引导 0.6.8 最新版及其通用配置
  8. Hash表的时间复杂度为什么是O(1)?
  9. adb发送什么命令能在手机屏幕弹窗显示_如何通过命令给手机刷机
  10. 如何利用Exif提取软件从图片中抓取有价值数据