Set file type java

Получение типа Mime файла в Java

В этом уроке мы рассмотрим различные стратегии получения MIME-типов файлов. Мы рассмотрим способы расширения типов MIME, доступных для стратегий, где это применимо.

Мы также покажем, где следует отдавать предпочтение одной стратегии перед другой.

2. Использование Java 7

Начнем с Java 7 – которая предоставляет метод Files.probeContentType(path) для разрешения типа MIME:

@Test public void whenUsingJava7_thenSuccess() < Path path = new File("product.png").toPath(); String mimeType = Files.probeContentType(path); assertEquals(mimeType, "image/png"); >

Этот метод использует установленные реализации FileTypeDetector для проверки типа MIME. Он вызывает probeContentType каждой реализации для разрешения типа.

Теперь, если файл распознается любой из реализаций, возвращается тип содержимого. Однако если этого не происходит, вызывается системный детектор типов файлов по умолчанию.

Однако реализации по умолчанию зависят от ОС и могут завершиться неудачей в зависимости от используемой ОС.

В дополнение к этому важно также отметить, что стратегия потерпит неудачу, если файл не будет присутствовать в файловой системе. Кроме того, если файл не имеет расширения, это приведет к сбою.

3. Использование URLConnection

URLConnection предоставляет несколько API – интерфейсов для обнаружения типов MIME файла. Давайте кратко рассмотрим каждый из них.

3.1. Использование getContentType()

Мы можем использовать getContentType() метод URLConnection для получения MIME-типа файла:

@Test public void whenUsingGetContentType_thenSuccess()< File file = new File("product.png"); URLConnection connection = file.toURL().openConnection(); String mimeType = connection.getContentType(); assertEquals(mimeType, "image/png"); >

Однако основным недостатком этого подхода является то, что он очень медленный .

3.2. Использование guessContentTypeFromName()

Далее давайте посмотрим, как мы можем использовать guessContentTypeFromName() для этой цели:

@Test public void whenUsingGuessContentTypeFromName_thenSuccess()< File file = new File("product.png"); String mimeType = URLConnection.guessContentTypeFromName(file.getName()); assertEquals(mimeType, "image/png"); >

Этот метод использует внутреннюю карту FileName Map для разрешения типа MIME из расширения .

Читайте также:  Wordpress include свой php

У нас также есть возможность использовать guessContentTypeFromStream() вместо этого, который использует первые несколько символов входного потока, чтобы определить тип.

3.3. Использование getFileNameMap()

Более быстрый способ получить тип MIME с помощью URLConnection – это использовать метод getFileNameMap() :

@Test public void whenUsingGetFileNameMap_thenSuccess()< File file = new File("product.png"); FileNameMap fileNameMap = URLConnection.getFileNameMap(); String mimeType = fileNameMap.getContentTypeFor(file.getName()); assertEquals(mimeType, "image/png"); >

Метод возвращает таблицу типов MIME, используемых всеми экземплярами URLConnection. Эта таблица затем используется для разрешения типа входного файла.

Встроенная таблица типов MIME очень ограничена, когда речь заходит о URLConnection .

По умолчанию класс использует content-types.properties файл в JRE_HOME/lib . Однако мы можем расширить его, указав пользовательскую таблицу с помощью свойства content.types.user.table :

System.setProperty("content.types.user.table",""); 

4. Использование MimetypesFileTypeMap

MimetypesFileTypeMap разрешает типы MIME с помощью расширения файла. Этот класс поставляется с Java 6 и, следовательно, очень удобен при работе с JDK 1.6.

Теперь давайте посмотрим, как его использовать:

@Test public void whenUsingMimeTypesFileTypeMap_thenSuccess() < File file = new File("product.png"); MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap(); String mimeType = fileTypeMap.getContentType(file.getName()); assertEquals(mimeType, "image/png"); >

Здесь мы можем либо передать имя файла, либо сам экземпляр File в качестве параметра функции. Однако функция с File instance в качестве параметра внутренне вызывает перегруженный метод, который принимает имя файла в качестве параметра.

Внутренне этот метод ищет файл с именем Внутренне этот метод ищет файл с именем для разрешения типа. Очень важно отметить, что метод ищет файл в определенном порядке:

  1. Программно добавленные записи в экземпляр MimetypesFileTypeMap
  2. . mime.types в домашнем каталоге пользователя
  3. /lib/mime.types
  4. ресурсы с именем META-INF/mime.types
  5. ресурс с именем META-INF/mimetypes.default (обычно встречается только в activation.jar файл)

Однако, если файл не найден, он вернет application/octet-stream в качестве ответа.

5. Использование jMimeMagic

jMimeMagic – это ограниченно лицензированная библиотека, которую мы можем использовать для получения типа MIME файла.

Читайте также:  Jvm java virtual machine виртуальная машина java

Давайте начнем с настройки зависимости Maven:

 net.sf.jmimemagic jmimemagic 0.1.5 

Мы можем найти последнюю версию этой библиотеки на Maven Central .

Далее мы рассмотрим, как работать с библиотекой:

@Test public void whenUsingJmimeMagic_thenSuccess() < File file = new File("product.png"); Magic magic = new Magic(); MagicMatch match = magic.getMagicMatch(file, false); assertEquals(match.getMimeType(), "image/png"); >

Эта библиотека может работать с потоком данных и, следовательно, не требует присутствия файла в файловой системе.

6. Использование Apache Tika

Apache Tika – это набор инструментов, который обнаруживает и извлекает метаданные и текст из различных файлов. Он имеет богатый и мощный API и поставляется с tika-core , который мы можем использовать для обнаружения типа MIME файла.

Давайте начнем с настройки зависимости Maven:

 org.apache.tika tika-core 1.18 

Далее мы будем использовать метод detect() для разрешения типа:

@Test public void whenUsingTika_thenSuccess() < File file = new File("product.png"); Tika tika = new Tika(); String mimeType = tika.detect(file); assertEquals(mimeType, "image/png"); >

Библиотека полагается на магические маркеры в префиксе потока для разрешения типа.

7. Заключение

В этой статье мы рассмотрели различные стратегии получения файла типа MIME. Кроме того, мы также проанализировали компромиссы подходов. Мы также указали сценарии, в которых мы должны отдавать предпочтение одной стратегии перед другой.

Полный исходный код , используемый в этой статье, доступен на GitHub , как всегда.

Источник

Определение типов файлов в Java

Программно определить тип файла может быть удивительно сложно, и было предложено и реализовано много подходов идентификации файлов на основе контента . Существует несколько реализаций, доступных в Java для обнаружения типов файлов, и большинство из них в значительной степени или исключительно основаны на расширениях файлов. В этом посте рассматриваются некоторые из наиболее распространенных реализаций обнаружения типов файлов в Java.

Читайте также:  Генератор случайного числа питон

В этом посте демонстрируется несколько подходов к идентификации типов файлов в Java. Каждый подход кратко описан, проиллюстрирован листингом кода, а затем связан с выводом, который демонстрирует, как различные общие файлы печатаются на основе расширений. Некоторые из подходов являются настраиваемыми, но все показанные здесь примеры используют сопоставления «по умолчанию», как это предусмотрено «из коробки», если не указано иное.

О примерах

Снимки экрана, показанные в этом посте, представляют собой каждый из перечисленных фрагментов кода, запускаемых для определенных тематических файлов, созданных для тестирования различных реализаций обнаружения типов файлов в Java. Прежде чем рассказать об этих подходах и продемонстрировать тип, который обнаруживает каждый из них, я перечисляю тестируемые файлы, их имена и имена.

файл
название
файл
расширение
файл
Тип
Тип совпадений
Конвенция о продлении?
actualXml.xml XML XML да
blogPostPDF PDF нет
blogPost.pdf PDF PDF да
blogPost.gif GIF GIF да
blogPost.jpg JPG JPEG да
blogPost.png PNG PNG да
blogPostPDF.txt текст PDF нет
blogPostPDF.xml XML PDF нет
blogPostPNG.gif GIF PNG нет
blogPostPNG.jpg JPG PNG нет
dustin.txt текст Текст да
dustin.xml XML Текст нет
Дастин Текст нет

Files.probeContentType (Path) [JDK 7]

Java SE 7 представила высоко утилитарный класс Files, и Javadoc этого класса кратко описывает его использование: «Этот класс состоит исключительно из статических методов, которые работают с файлами, каталогами или другими типами файлов» и «в большинстве случаев с методами, определенными здесь делегирует соответствующему провайдеру файловой системы для выполнения файловых операций ».

Класс java.nio.file.Files предоставляет метод probeContentType (Path), который «проверяет тип содержимого файла» посредством использования «установленных реализаций FileTypeDetector» (Javadoc также отмечает, что «данный вызов виртуальной машины Java») ведет общесистемный список детекторов типов файлов »).

Источник

Оцените статью