#java #file-io #java-11
#java #file-io #java-11
Вопрос:
Кажется, что Files.probeContentType()
возвращает null
для файла (где тип MIME не указан в его имени файла) на OpenJDK 11, в то время как он работал на OpenJDK 8 (в Linux x64). В чем причина этого?
Примечание: это может работать для файлов, где тип указывается его именем, например, «test.pdf» приведет к «application / pdf», но переименование файла в «test» приведет null
к.
Комментарии:
1. Невозможно воспроизвести. Я запустил
Files.probeContentType(Paths.get("test.pdf"))
Window, используя Oracle 1.8.0_181, OpenJDK 11.0.2 и AdoptOpenJDK 15.0.1 9, и все они вернулисьapplication/pdf
.2. @Andreas, это зависит от платформы. В Windows есть
RegistryFileTypeDetector
функция, которая определяет тип на основе расширения имени файла, сопоставляемого приложению в реестре Windows.3. @Andreas, в Windows вы можете воспроизвести это, переименовав свой PDF-файл в «test» без расширения. (Единственный) доступный детектор не проверяет содержимое, но не сможет выполнить поиск (несуществующего) расширения в реестре.
Ответ №1:
Определение типа файла в значительной степени зависит от платформы и не считалось надежным. Например, GnomeFileTypeDetector
был доступен в JDK 8, но работает только в системах Linux.
Разработчики OpenJDK решили удалить оба GnomeFileTypeDetector
и MagicFileTypeDetector
из JDK (уже в JDK 9), см. OpenJDK bug tracker и здесь .
Доступные детекторы MimeTypesFileTypeDetector
(в Linux) или RegistryFileTypeDetector
в Windows просто реализуют сопоставление расширений имен файлов с типами MIME, но не проверяют фактическое содержимое файлов.
(Примечание: все реализации детектора найдены (или нет) в пакете sun.nio.fs
.)
Ответ №2:
У меня такая же проблема в контейнере docker с Ubuntu 20.04. Обычно контейнер очень маленький и имеет очень специфические инструменты. Я решил проблему установки пакетов libmagic-mgc и libmagic1 с помощью команды apt, которая содержит знаменитую команду «file», используемую для проверки MimeType файла.