我正在开发一款将 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/