java - 如何使用 "DFLT-X"方法编写 Zip 文件

标签 java c++ deflate zipoutputstream

我正在开发一款将 XML 文件捆绑并导出为 zip 的软件。压缩方法是“Deflate”(代码片段如下)。

另一个(较旧的)软件需要这些 zip 文件,该软件是在“QT”上构建的(代码也被截断在下面)。

问题是,第二个软件不接受 zip 文件。如果这些 zip 文件被手动重新压缩,它们会突然工作。

为了找到生成的 zip 和手动 zip 中的任何差异,我将它们都插入“powerArchiver”,发现它们除了“方法”之外完全相同,即 workign zip 上的“DFLT-X”和“DFLT-N”(注意:工作是指第二次软件导入,两个 zip 文件都可以手动提取而不会出现问题)。

有什么想法如何使用 Java utils 库获取“DFLT-X”方法吗?

我尝试了“ZipOutputStream”、“Deflater”和“DeflaterOutputStream”的所有设置和变体(.setLevel()、setMethod()),但我只得到了“DFLT-N”格式。 这些格式的说明未包含在 powerArchiver 论坛或其他地方。 “DFLT-N”似乎指的是“Deflate,Normal”和用于更高压缩的 X 变体,但不是 Deflate64。

软件1,生成zip:

final byte[] buffer = new byte[1024];
        FileOutputStream fos = null;
        ZipOutputStream zos = null;

        try {
            fos = new FileOutputStream(zipFile);
            zos = new ZipOutputStream(fos);
            FileInputStream inputStream = null;

            for (final String file : this.fileList) {
                if (file.toString().contains(".xml")) {
                    final ZipEntry ze = new ZipEntry(File.separator + file);
                    zos.putNextEntry(ze);
                    try {
                        inputStream = new FileInputStream(sourceFolder + File.separator + file);
                        int len;
                        while ((len = inputStream.read(buffer)) > 0) {
                            zos.write(buffer, 0, len);
                        }
                    }
                    finally {
                        if (inputStream != null) {
                            inputStream.close();
                        }
                    }
                }
            }
            zos.closeEntry();

        }
        catch (final IOException ex) {
            ex.printStackTrace();
        }

软件2,读取zip:

bool WfControlDataStorage::load(const QString& identifier, QByteArray& outZipFileContent) const
{
    QFile dataFile(identifierToFilepath(identifier));

    if(dataFile.open(QFile::ReadOnly)) {
        outZipFileContent = dataFile.readAll();
        dataFile.close();

        return true;
    }

    return false;
}

最佳答案

@Holger 谢谢您的宝贵时间,听起来您所做的正是我所做的。

解决方案:

在我的项目中,zip 条目名称有一个前导“/”,如“/someName”。这在 powerarchiver 中不可见,也不会妨碍解压缩,但我的接收软件在解析此名称时遇到问题。 使用 powerarchiver 重新打包删除了该斜线,因此一堆未记录的行为让我的生活变得一团糟。

就 DFLT-X 和 DFLT-N 而言,这些是奇怪的 powerarchiver 特定命名,我仍然无法说出它们如何确定差异。但我可以说,deflate 与 0-9 的简单级别和基本上从未使用过且已过时的“Deflate64”没有什么不同的“方法”。 DFLT-X 命名与两者无关,而且恕我直言,完全无关。

关于java - 如何使用 "DFLT-X"方法编写 Zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57361461/

相关文章:

java - 创建具有未指定可变行长度的多维数组 (Java)

java - 使用 POI 和 Jsoup 的超链接位于错误位置

java - 如何覆盖 Jetty 11.0.6 中的请求日志记录机制

C++:函数体内的顺序重要吗

http - 为什么现实世界的服务器更喜欢 gzip 而不是 deflate 编码?

c - 为什么要排列代码长度代码(动态霍夫曼代码 | RFC-1951)?

java - 将消息传递给jsp(struts2)

c++ - 如何使用 SWIG 在 Python __init__ 函数中包装 C++ 工厂方法

c++ - 如何从文件中读取数据,然后将数据转换为int并将其存储在 vector 中

C# MemoryStream 大于 FileStream