javac++deflatezipoutputstream

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


I am working on a Software which bundles and exports XML files as a zip. The compression method is "Deflate" (Code snipped included below).

These zip files are needed in another (older) Software, which is build up on "QT" (Code snipped also below).

The Problem is, that the zip files are not accepted in the second Software. If these zip files get rezipped manually, they work suddendly.

To find any differences in the generated zip and the Manual one, i plugged both into "powerArchiver" and saw they are exactly the same except for the "Method", which is "DFLT-X" on the workign zip and "DFLT-N" on the not working one (Note: working refers to the second Software import, both zip files can be extracted without Problems manually).

Any ideas how i can get the "DFLT-X" Method with Java utils libs?

I tried all settings and variants (.setLevel(), setMethod()) for "ZipOutputStream", "Deflater" and "DeflaterOutputStream" but i only got the "DFLT-N" Format. The Explanation what these Formats are is not included in the powerArchiver Forums or else where. "DFLT-N" seems to refer to "Deflate, Normal" and the X variant for some higher compression, but not Deflate64.

Software 1, generating the 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();
        }

Software 2, reading the 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;
}

Solution

  • @Holger Thank you for your Time, sounds like you did exactly what i did too.

    Solution:

    in my Project the zip Entry name had a leading "/" like "/someName". This was not visible in powerarchiver and also didnt hinder decompressing, but my recieving software had troubles resolving this name. Repacking with powerarchiver removed that slash, so a bunch of undocumented behavior made my life hell.

    In Terms of DFLT-X and DFLT-N, these are strange powerarchiver specific namings and i still cannot say how they determine the difference. But i can say, that deflate has no different "methods" nexto the simple levels from 0-9 and the "Deflate64" which is basically never used and obsolete. The DFLT-X naming is unrelated to both and imho completly irrelevant.