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

How to write a Zip File with the "DFLT-X" Method

我正在开发一个将 XML 文件打包并导出为 zip 文件的软件。压缩方法是"Deflate"(下面包含代码片段)。

另一个(较旧的)软件需要这些 zip 文件,该软件是在 "QT" 上构建的(下面也有代码片段)。

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

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

关于如何使用 Java 实用程序库获得 "DFLT-X" 方法的任何想法?

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

软件一,生成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 没有什么不同 "methods" nexto 简单级别从 0-9 和 "Deflate64" 基本上从未使用和过时。 DFLT-X 命名与两者无关,恕我直言,完全无关。