使用 Zip4j 在 Android 中创建 zipFile 时出现异常:可能不是 zip 文件或损坏的 zip 文件
Exception when create zipFile in Android with Zip4j: Probably not a zip file or a corrupted zip file
我在 android 中使用 zip4j 库生成 zipfile 时遇到问题,代码如下:
try {
ZipFile zipFile = new ZipFile(dest);
zipFile.setFileNameCharset("GBK");
if (srcFile.isDirectory()) {
zipFile.addFolder(srcFile, parameters);
} else {
zipFile.addFile(srcFile, parameters);
}
} catch (Exception e) {
e.printStackTrace();
}
我收到异常消息:
net.lingala.zip4j.exception.ZipException: Probably not a zip file or a corrupted zip file
at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:179)
at net.lingala.zip4j.core.HeaderReader.readAllHeaders(HeaderReader.java:78)
at net.lingala.zip4j.core.ZipFile.readZipInfo(ZipFile.java:425)
at net.lingala.zip4j.core.ZipFile.checkZipModel(ZipFile.java:935)
at net.lingala.zip4j.core.ZipFile.addFiles(ZipFile.java:263)
at net.lingala.zip4j.core.ZipFile.addFile(ZipFile.java:250)
Caused by: java.io.IOException: Negative seek offset
at java.io.RandomAccessFile.seek(RandomAccessFile.java:555)
at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:117)
此代码在 Eclipse 中对本地文件运行良好,但在 Android 中运行不佳,我很确定目标 .zip 路径是正确的,并且 zip4j 库版本是 1.3.2。
谁能给我一些建议?
我遇到了非常相似的堆栈跟踪。但是,我在桌面上使用 1.3.2 版的 java 和 zip4j。我不确定我的回答与 android 有什么关系,但就是这样。
我的堆栈跟踪
Caused by: net.lingala.zip4j.exception.ZipException: Probably not a zip file or a corrupted zip file
at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:179)
at net.lingala.zip4j.core.HeaderReader.readAllHeaders(HeaderReader.java:78)
at net.lingala.zip4j.core.ZipFile.readZipInfo(ZipFile.java:425)
at net.lingala.zip4j.core.ZipFile.checkZipModel(ZipFile.java:935)
at net.lingala.zip4j.core.ZipFile.addFolder(ZipFile.java:343)
at net.lingala.zip4j.core.ZipFile.addFolder(ZipFile.java:330)
Caused by: java.io.IOException: Negative seek offset
at java.io.RandomAccessFile.seek(RandomAccessFile.java:555)
at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:117)
at net.lingala.zip4j.core.HeaderReader.readAllHeaders(HeaderReader.java:78)
我是这样用zip4j的
Path destination = Files.createTempFile("export", ".zip");
ZipFile zip = new ZipFile(destination.toFile());
为了解决这个问题我改成了
File destination = new File(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString());
ZipFile zip = new ZipFile(destination);
区别在于 Files.createTempFile() 创建空文件并且该文件必须搞砸 ZipFile
的构造函数。当我通过未占用的路径 File
时,问题就消失了。
我遇到了同样的问题,因为我使用了AES加密,但没有设置参数AES数据密钥。
这个的工作代码连同受密码保护的 zip 是:
File dbFile = new File(ctx.getExternalFilesDir("") + File.separator +
AppConstants.DB_PATH + File.separator + AppConstants.DB_NAME);
zipName = AppConstants.DB_NAME + "-" + getCurrentDateTime() + ".zip";
ZipFile zipFile = new ZipFile(folderPath + File.separator + zipName);
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
parameters.setPassword(AppUtil.decodeStr(AppConstants.DB_PASSWORD));
zipFile.addFile(dbFile, parameters);
但是,由于以下原因,该问题可能仍然会出现:
- 添加到 zipFile 时源文件不存在,
- 该应用没有读取源文件的权限,
- 目标 zip 文件可能包含特殊符号或 space
文件名。
我在 android 中使用 zip4j 库生成 zipfile 时遇到问题,代码如下:
try {
ZipFile zipFile = new ZipFile(dest);
zipFile.setFileNameCharset("GBK");
if (srcFile.isDirectory()) {
zipFile.addFolder(srcFile, parameters);
} else {
zipFile.addFile(srcFile, parameters);
}
} catch (Exception e) {
e.printStackTrace();
}
我收到异常消息:
net.lingala.zip4j.exception.ZipException: Probably not a zip file or a corrupted zip file
at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:179)
at net.lingala.zip4j.core.HeaderReader.readAllHeaders(HeaderReader.java:78)
at net.lingala.zip4j.core.ZipFile.readZipInfo(ZipFile.java:425)
at net.lingala.zip4j.core.ZipFile.checkZipModel(ZipFile.java:935)
at net.lingala.zip4j.core.ZipFile.addFiles(ZipFile.java:263)
at net.lingala.zip4j.core.ZipFile.addFile(ZipFile.java:250)
Caused by: java.io.IOException: Negative seek offset
at java.io.RandomAccessFile.seek(RandomAccessFile.java:555)
at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:117)
此代码在 Eclipse 中对本地文件运行良好,但在 Android 中运行不佳,我很确定目标 .zip 路径是正确的,并且 zip4j 库版本是 1.3.2。
谁能给我一些建议?
我遇到了非常相似的堆栈跟踪。但是,我在桌面上使用 1.3.2 版的 java 和 zip4j。我不确定我的回答与 android 有什么关系,但就是这样。
我的堆栈跟踪
Caused by: net.lingala.zip4j.exception.ZipException: Probably not a zip file or a corrupted zip file
at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:179)
at net.lingala.zip4j.core.HeaderReader.readAllHeaders(HeaderReader.java:78)
at net.lingala.zip4j.core.ZipFile.readZipInfo(ZipFile.java:425)
at net.lingala.zip4j.core.ZipFile.checkZipModel(ZipFile.java:935)
at net.lingala.zip4j.core.ZipFile.addFolder(ZipFile.java:343)
at net.lingala.zip4j.core.ZipFile.addFolder(ZipFile.java:330)
Caused by: java.io.IOException: Negative seek offset
at java.io.RandomAccessFile.seek(RandomAccessFile.java:555)
at net.lingala.zip4j.core.HeaderReader.readEndOfCentralDirectoryRecord(HeaderReader.java:117)
at net.lingala.zip4j.core.HeaderReader.readAllHeaders(HeaderReader.java:78)
我是这样用zip4j的
Path destination = Files.createTempFile("export", ".zip");
ZipFile zip = new ZipFile(destination.toFile());
为了解决这个问题我改成了
File destination = new File(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString());
ZipFile zip = new ZipFile(destination);
区别在于 Files.createTempFile() 创建空文件并且该文件必须搞砸 ZipFile
的构造函数。当我通过未占用的路径 File
时,问题就消失了。
我遇到了同样的问题,因为我使用了AES加密,但没有设置参数AES数据密钥。
这个的工作代码连同受密码保护的 zip 是:
File dbFile = new File(ctx.getExternalFilesDir("") + File.separator +
AppConstants.DB_PATH + File.separator + AppConstants.DB_NAME);
zipName = AppConstants.DB_NAME + "-" + getCurrentDateTime() + ".zip";
ZipFile zipFile = new ZipFile(folderPath + File.separator + zipName);
ZipParameters parameters = new ZipParameters();
parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
parameters.setEncryptFiles(true);
parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
parameters.setPassword(AppUtil.decodeStr(AppConstants.DB_PASSWORD));
zipFile.addFile(dbFile, parameters);
但是,由于以下原因,该问题可能仍然会出现:
- 添加到 zipFile 时源文件不存在,
- 该应用没有读取源文件的权限,
- 目标 zip 文件可能包含特殊符号或 space 文件名。