如何知道压缩文件是否是Jar文件?

时间:2011-08-16 21:41:23

标签: java jar zip file-type

问题是我们尝试使用JarFile类来确定文件是否是Jar文件。

但是,如果我们这样做,docx文件也将被视为Jar文件。

因为docx文件实际上是一个zip文件。

这是我的代码:

   public static boolean detectJarFile(String file) throws IOException {
      try {
        JarFile jarFile = new JarFile(file);

      } catch (java.util.zip.ZipException e) {
        // the uploaded file is NOT JAR file
        return false;
      } 

      return true;
    }

如何知道文件是否真的是Jar文件?

有什么想法吗?

5 个答案:

答案 0 :(得分:4)

可执行的.jar文件应该有一个“幻数”

我找到了一些枚举此数字的地方: 根据大多数地方,数字是十六进制的0xCAFEBABE。

我在Oracle的论坛上发现了这个讨论: https://forums.oracle.com/forums/thread.jspa?threadID=2470576&tstart=0

此外,在JAR文件概述中,它提到“Solaris 2.6内核已经扩展为识别标识JAR文件的特殊”魔术“数字”: http://docs.oracle.com/javase/7/docs/technotes/guides/jar/jarGuide.html

此外,要获得更深入的信息,请查看the jar file specifications at Oracle.

答案 1 :(得分:3)

一般来说,Jar文件只不过是一个带有一些特殊属性的zip文件(“普通”zip文件可能有,但不一定有。)

来自JAR File Specification

  

JAR文件是基于流行的ZIP文件格式的文件格式,用于聚合许多文件格式   文件合而为一。 JAR文件本质上是一个包含可选META-INF目录的zip文件。

所以,看看你的候选人是否有这样的目录。如果它(并且至少有MANIFEST.MF具有正确的格式),则它是一个jar文件。

但是作为一个jar文件没什么特别的,这个知识并没有真正给你任何东西。它并不一定意味着你可以在那里执行类。

例如,OpenOffice.org文件格式(至少是旧的,我不确定OpenDocument)是基于jar格式的。

答案 2 :(得分:3)

  

//上传的文件不是JAR文件

是的,确实如此。这里的问题是你假设关于JAR的某些事情是不正确的。与此处的其他一些答案相反,JAR文件的only requirement是ZIP格式。 META-INF / MANIFEST.MF文件是可选的。 jar不需要包含.class文件。它不需要是ZIP文件。您应该重新表述您的问题,以准确说明您正在寻找的是什么,因为它不是JAR。我怀疑你想验证那些不是的东西。

答案 3 :(得分:2)

您可以检查文件contains是否为MANIFEST.MF条目。

public static boolean detectJarFile(String file) throws IOException {
    ...
    // First check if this is a zip file.
    // Then do this.
    ZipFile zip = new ZipFile(file);
    boolean hasManifestEntry = zip.getEntry("META-INF/MANIFEST.MF") != null;
    zip.close();
    return hasManifestEntry;
}

答案 4 :(得分:2)

除了Kal提供的答案之外,请检查文件是否包含至少一个扩展名为“.class”的文件。否则jar文件将无效,几乎所有'.docx'文件都不会有这样的文件。