我想确定我的存档文件是zip还是rar。但是我在验证文件之前遇到运行时错误的问题。我想创建自定义通知:

public class ZipValidator {
  public void validate(Path pathToFile) throws IOException {
    try {
      ZipFile zipFile = new ZipFile(pathToFile.toFile());
      String zipname = zipFile.getName();
    } catch (InvalidZipException e) {
      throw new InvalidZipException("Not a zip file");
    }
  }
}

目前,我有运行时错误:

最佳答案

我建议打开一个普通的InputStream读取前几个字节(魔术字节),而不要依赖文件扩展名,因为这很容易被欺骗。另外,您可以省略创建和解析文件的开销。

对于RAR,首字节应为 52 61 72 21 1A 07

对于ZIP,它应该是以下之一:

  • 50 4B 03 04
  • 50 4B 05 06 (空存档)
  • 50 4B 07 08 (跨归档)。

  • 资料来源:https://en.wikipedia.org/wiki/List_of_file_signatures

    还有一点,只是看一下您的代码:

    为什么要捕获InvalidZipException并扔掉它并构造一个新的呢?这样,您将丢失原始异常中的所有信息,从而难以调试和理解到底出了什么问题。要么根本就不要捉住它,或者如果必须将其包装起来,就对它做对:
    } catch (InvalidZipException e) {
      throw new InvalidZipException("Not a zip file", e);
    }
    

    07-26 02:17