Чтобы чип с моими 5 центами:
TL, DR
Я использую MimetypesFileTypeMap и добавляю любой мим, которого нет, и я специально нуждаюсь это файл mime.types.
И теперь длинное чтение:
Прежде всего, список типов MIME - огромный , см. здесь: https://www.iana.org/assignments/media-types/media-types.xhtml
Мне нравится использовать стандартные средства, предоставляемые JDK во-первых, и если это не сработает, я пойду и посмотрю что-то еще.
Определить тип файла из расширения файла
Начиная с версии 1.6 Java имеет MimetypesFileTypeMap, как указано в один из ответов выше, и это самый простой способ определить тип mime:
new MimetypesFileTypeMap().getContentType( fileName );
В его реализации ванили это не делает много (т. е. работает для .html, но это не так. PNG). Однако очень просто добавить любой тип контента, который вам может понадобиться:
Примеры записей для png и js-файлов будут be:
image/png png PNG
application/javascript js
Для формата файла mime.types см. более подробную информацию здесь: https://docs.oracle.com/javase/7/docs/api/javax/activation/MimetypesFileTypeMap .html
Определить тип файла из содержимого файла
Начиная с 1.7, Java имеет java.nio.file.spi.FileTypeDetector , который определяет стандартный API для определения типа файла в конкретном способе реализации .
Чтобы получить тип mime для файла, вы просто будете использовать Files и сделать это в вашем коде:
Files.probeContentType(Paths.get("either file name or full path goes here"));
В определении API предусмотрены средства, которые поддерживают либо определение типа файла mime из имени файла, либо из файла fil e content (магические байты). Вот почему метод probeContentType () вызывает IOException, если реализация этого API использует Path, предоставленный ему, чтобы фактически попытаться открыть связанный с ним файл.
Опять ваниль реализация этого (тот, который поставляется с JDK) оставляет желать лучшего.
В каком-то идеальном мире в галактике далеко, далеко, все эти библиотеки, которые пытаются решить эту проблему с файлом-типом можно просто реализовать java.nio.file.spi.FileTypeDetector , вы бы упали в jar-файл предпочтительной библиотеки реализации в ваш путь к классам и это было бы так.
В реальном мире, где вам нужен раздел TL, DR, вы должны найти библиотеку с большинством звезд рядом с ее именем и использовать ее. Для этого конкретного случая мне не нужен один (пока;)).