java - 如何在java中识别一个zip文件?

标签 java archive identification

我想识别我的存档是 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");
    }
  }
}

目前我有运行时错误:

java.util.zip.ZipException: error in opening 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);
}

关于java - 如何在java中识别一个zip文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33934178/

相关文章:

iphone - 错误,在 bundle ""中找不到权利

Java:如何解压缩内存使用率较低的文件(zip或tar.gz)?

syntax - 这是什么 Visual Basic 语法(开始/结束,无类)?

android - 使用 Nmap 进行移动设备识别

java - 如何获取 JButton 的特定 ID?

java - 每 2 秒刷新一次从 JSON 响应填充的 listView

java - 接收数据报包不显示

java - 外部部署war的springboot配置文件

java - 在自定义 Eclipse 透视图中显示 View