当前位置: 首页 > 知识库问答 >
问题:

在zip文件中插入已压缩的文件

黄昊英
2023-03-14

我一直在寻找这个问题,但我找不到任何我可以使用的回应。

并合并到zip中以进行压缩(根据https://docs.oracle.com/javase/8/docs/api/java/util/zip/ZipOutputStream.html#setMethod-int-,ZipEntry中的DEFLETED)。在这种情况下,如何?

我从谷歌和其他搜索者那里获得的关于用java压缩zip文件的大部分信息可以在以下网站上恢复:

  • 将zip作为文件系统打开https://fahdshariff.blogspot.com/2011/08/java-7-working-with-zip-files.html
  • 直接使用流(https://www.java-examples.com/create-zip-file-using-zipoutputstream-example)

我使用JZlib偏转文件(但是你可以使用任何其他库。一个例子,http://www.avajava.com/tutorials/lessons/how-do-i-deflate-and-inflate-a-file.html)

正如你所期望的,当我尝试插入已经放气的文件时,它们会再次放气(使用ZipEntry中的DEFLETED方法,这是默认的),当zip文件被解压缩时,文件会放气到它们以前已经放气的状态。

寻找ZipOutputStream的来源。从oracle的java中,您可以看到有两种向zip添加条目的方法:

    DEFLATED (an integer set to 20)
    STORED   (an integer set to 10)

我想要的是添加存储在zip中的泄密条目,但一旦添加,就要在自己的zip中更改信息,就好像它们是经过泄密处理的一样。你知道有什么图书馆或其他方法可以轻松做到这一点吗?我在考虑从jdk ZipoutpStream继承并重写方法来制作自己的ZipoutpStream,但根据这个想法对方法进行“快速复制粘贴和修改”——只是为了有一种“它可以工作”的感觉——也没有按照我的希望工作。

我之所以希望使用这个选项,是因为可以按需动态压缩zip文件中的大量文件。我不确定这是否可以节省时间和cpu,将压缩后的文件保存在数据库中,并在每个时刻选择那些被请求进行压缩的文件。

谢谢,

共有3个答案

柴声
2023-03-14

最后,我从第一步走得更远,更深入地分析了jdk源代码,并花了一些时间调试和修改它:

https://gist.github.com/gylz/b2db94ce55f1829f2e2a2cd498092d46

https://gist.github.com/gylz/284d8b891fc0bbd3161d1ec5929be074

如果你想尝试,你必须在测试类的变量PATH_ZIP_DIR,PATH_in_DIR,PATH_TMP_DIR中指出你想要的路径。要压缩的文件取自目录中的路径和目录中创建的zip文件。测试类很短,也不太复杂(尽管它也是ExtrazipoutpOutstream类的草稿)。我使用PATH_in_DIR中的简单文本文件来测试它们的压缩。如您所见,在这个类中,deflate()方法是在compress()将文件放入zip文件之前执行deflaton的方法(由于修改了extrazipoutstream,使用存储但写入与文件相关联的元数据,就像它们已被extrazipoutstream本身压缩一样)

在附加到ExtraZipOutputStream头的注释块中。类中,我将解释如何检测对原始代码所做的更改。

管弘
2023-03-14

我可以想象一个黑客。。。。在putnextry(e)write之间,可以使用e.setMethod。类似这样的代码在putnextery的末尾写入标题,并决定在write中进行压缩,在那里它访问在putnextery中给出的条目(不复制)。

调用CloseEntry之前,您可能需要将其翻转回来。

我没试过,因为你可以试得更快。

我不确定这是否可以节省时间和cpu,将压缩后的文件保存在数据库中

我不明白,但我很怀疑。

OTOH如果你有一大堆*,你的想法看起来也适用。gz文件,您希望存储它们的纯文本,而无需对其进行解压缩和再次压缩。

房唯
2023-03-14

zip格式并不是非常复杂,所以您应该只获取压缩后的数据,并在其周围编写自己的zip文件头。格式记录在这里。如果您是从gzip文件导出压缩数据,那么您也应该已经有了CRC和未压缩的长度。(如果要转换的每个gzip文件都包含一个deflate流,即一个gzip成员,并且如果未压缩的长度确保小于232字节,则可以删除该语句中的“应该”。)

 类似资料:
  • 我有一个包含一些子目录的目录。我可以看到目录中带有“gci-Recurse *| %{ Write-host$_}”的文件。在这个给定的列表中有一些zip文件。我想在使用“展开存档”时将这些zip文件解压缩到一个名为zip文件的目录中。 如何将调用“gci-Recurse*|%{write host${}”与“Expand Archive”结合起来。

  • 本文向大家介绍Python压缩解压缩zip文件及破解zip文件密码的方法,包括了Python压缩解压缩zip文件及破解zip文件密码的方法的使用技巧和注意事项,需要的朋友参考一下 python 的 zipfile 提供了非常便捷的方法来压缩和解压 zip 文件。 例如,在py脚本所在目录中,有如下文件: 将 readability 目录中的文件压缩到脚本所在目录的 readability.zip

  • 我正在使用Julia的ZipFile包来提取和处理csv文件。没问题,但是当我遇到zip文件中的zip文件时,我也想处理它,但是遇到了一个错误。 Julia ZipFile文档如下:https://zipfilejl.readthedocs.io/en/latest/ 对如何做到这一点有什么想法吗?

  • 我有多个zip文件在一个文件夹和另一个zip文件存在于每一个这些zip文件夹。我想解压第一个和第二个zip文件夹,并创建它们自己的目录。 这是结构 如上所示,在中,我们有多个zip文件,在每个zip文件中,都存在另一个zip文件。我想解压缩,,和到新的文件夹中。我想使用与父zip文件夹相同的名称来放置每个结果。我尝试了以下答案,但这只解压缩第一个文件夹。 顺便说一句,我在Jenkins管道中运行这

  • 我试图压缩字符串上转换的Xml列表,将它们保存在一个zip文件中,并在restful上作为POST的主体返回。但是每次我保存文件时,都会出现错误“存档格式未知或损坏”。 有人能帮我吗?

  • 写压缩文件 # gzip_write.py import gzip import io import os outfilename = 'example.txt.gz' with gzip.open(outfilename, 'wb') as output: with io.TextIOWrapper(output, encoding='utf-8') as enc: e