Как узнать, является ли заархивированный файл файлом Jar или нет? - PullRequest
3 голосов
/ 17 августа 2011

Проблема в том, что мы пытаемся использовать класс 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 ]

4 голосов
/ 05 декабря 2012

Исполняемые файлы .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

Также, для получения более подробной информации, проверьте спецификации файла jar в Oracle.

3 голосов
/ 17 августа 2011

// загруженный файл НЕ является файлом JAR

Да, это так.Проблема здесь в том, что вы предполагаете определенные вещи о JAR, которые не соответствуют действительности.Вопреки некоторым другим ответам здесь, единственное требование для файла JAR заключается в том, что он находится в формате ZIP.Файл META-INF / MANIFEST.MF является необязательным.В банке не должно быть файлов .class.Это не обязательно должно быть что-то кроме файла ZIP.Вы должны переформулировать свой вопрос, чтобы точно указать, что именно вы ищете, потому что это не JAR.Я подозреваю, что вы хотите убедиться, что вместо этого нет .

3 голосов
/ 17 августа 2011

В общем случае файл Jar - это не что иное, как файл zip с некоторыми особыми свойствами (который может иметь «обычный» файл zip, но не обязательно).

Из спецификации файла JAR :

JAR-файл - это формат файла, основанный на популярном формате ZIP-файла, который используется для объединения многих файлы в один. Файл JAR, по сути, представляет собой zip-файл, который содержит необязательный каталог META-INF.

Итак, посмотрите, есть ли у вашего кандидата такой каталог. Если он имеет (и есть хотя бы MANIFEST.MF с правильным форматом в нем), это файл jar.

Но то, что файл jar не является чем-то особенным, это знание ничего вам не даст. Это не означает, что в нем есть классы, которые вы можете выполнять.

Например, формат файла OpenOffice.org (по крайней мере, старый, я не уверен насчет OpenDocument) основан на формате jar.

2 голосов
/ 17 августа 2011

В дополнение к ответу, предоставленному Kal, проверьте, содержит ли файл хотя бы один файл с расширением .class.В противном случае файл jar не будет работать, и почти все файлы .docx не будут иметь такого файла.

2 голосов
/ 17 августа 2011

Вы можете проверить, содержит ли файл запись 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;
}
...