【问题标题】:Zip4j libary: How do I check if the zip file is empty?Zip4j 库:如何检查 zip 文件是否为空?
【发布时间】:2015-12-08 16:59:41
【问题描述】:

您好,我正在使用 Java 的 zip4j 库将 zip 文件提取到目录中。

我从互联网上得到这个 zip 文件。

一切正常,但是当 zip 文件为空时出现此异常。

12-08 16:52:00.964 29829-30843/ W/System.err: net.lingala.zip4j.exception.ZipException: net.lingala.zip4j.exception.ZipException: java.io.IOException: offset < 0: -20
12-08 16:52:00.964 29829-30843/ W/System.err:     at net.lingala.zip4j.core.HeaderReader.readZip64EndCentralDirLocator(HeaderReader.java:546)
12-08 16:52:00.965 29829-30843/ W/System.err:     at net.lingala.zip4j.core.HeaderReader.readAllHeaders(HeaderReader.java:82)
12-08 16:52:00.965 29829-30843/ W/System.err:     at net.lingala.zip4j.core.ZipFile.readZipInfo(ZipFile.java:425)
12-08 16:52:00.965 29829-30843/ W/System.err:     at net.lingala.zip4j.core.ZipFile.getFileHeaders(ZipFile.java:688)
12-08 16:52:00.965 29829-30843/ W/System.err:     at com.myapp.services.DownloadContentIntentService.onHandleIntent(DownloadContentIntentService.java:124)
12-08 16:52:00.965 29829-30843/ W/System.err:     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:66)
12-08 16:52:00.965 29829-30843/ W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:102)
12-08 16:52:00.965 29829-30843/ W/System.err:     at android.os.Looper.loop(Looper.java:148)
12-08 16:52:00.965 29829-30843/ W/System.err:     at android.os.HandlerThread.run(HandlerThread.java:61)
12-08 16:52:00.965 29829-30843/ W/System.err: Caused by: net.lingala.zip4j.exception.ZipException: java.io.IOException: offset < 0: -20
12-08 16:52:00.965 29829-30843/ W/System.err:     at net.lingala.zip4j.core.HeaderReader.setFilePointerToReadZip64EndCentralDirLoc(HeaderReader.java:816)
12-08 16:52:00.965 29829-30843/ W/System.err:     at net.lingala.zip4j.core.HeaderReader.readZip64EndCentralDirLocator(HeaderReader.java:517)
12-08 16:52:00.965 29829-30843/ W/System.err:   ... 8 more
12-08 16:52:00.966 29829-30843/ W/System.err: Caused by: java.io.IOException: offset < 0: -20
12-08 16:52:00.966 29829-30843/ W/System.err:     at java.io.RandomAccessFile.seek(RandomAccessFile.java:600)
12-08 16:52:00.966 29829-30843/ W/System.err:     at net.lingala.zip4j.core.HeaderReader.setFilePointerToReadZip64EndCentralDirLoc(HeaderReader.java:814)
12-08 16:52:00.966 29829-30843/ W/System.err:   ... 9 more

这是有问题的行。

 ZipFile zipFile = new ZipFile(temp);

调试时,我发现这种情况只发生在空 zip 文件中,即里面什么都没有的存档。

但是我遇到的问题是如何检查存档中的文件数量,因为我发现如果我这样做了

 List<FileHeader> fileHeaders = zipFile.getFileHeaders();
 if(fileHeaders != null && fileHeaders.size() > 0){

 }

我能够获取有关 zip 内容的信息,即文件数量和大小等。

但是有一个大问题。 这里抛出异常

此时抛出异常

 ZipFile zipFile = new ZipFile(temp);

我需要实例来访问文件头

请帮忙

【问题讨论】:

  • 这回答了您的问题:stackoverflow.com/questions/7190618/… 空的 ZIP 文件不是有效的 ZIP 文件,因此您只需检查文件是否为空。
  • 为什么不直接捕获并处理异常?!?

标签: java android zip4j


【解决方案1】:

如果输入文件不包含 zip 条目,API zip.isValidZipFile() 将返回 false。 (使用 zip4j v1.3.2 测试)

顺便说一句,新建 ZipFile 对象时不会引发异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2015-10-14
    • 2023-02-16
    • 1970-01-01
    相关资源
    最近更新 更多