如何使用 "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 命名与两者无关,恕我直言,完全无关。
我正在开发一个将 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 命名与两者无关,恕我直言,完全无关。