Files.probeContentType() returns 在 OpenJDK 11 上为空

Files.probeContentType() returns null on OpenJDK 11

似乎 Files.probeContentType() returns null 用于 OpenJDK 11 上的文件(MIME 类型未由其文件名指示),而它正在 OpenJDK 8 上工作(在 Linux x64 上)。这是什么原因?

注意:它可能适用于类型由其名称指示的文件,例如,“test.pdf”将生成“application/pdf”,但是将文件重命名为“test”会产生 null.

文件类型检测在很大程度上是特定于平台的,不被认为是可靠的。例如,GnomeFileTypeDetector 在 JDK 8 中可用,但仅适用于 Linux 系统。

OpenJDK 开发人员已决定从 JDK 中删除 GnomeFileTypeDetectorMagicFileTypeDetector(已在 JDK 9 中),请参阅 OpenJDK bug tracker and here.

可用检测器 MimeTypesFileTypeDetector(在 Linux 上)或 RegistryFileTypeDetector 在 Windows 上只是实现从文件扩展名到 MIME 类型的映射,但不检查实际的文件内容。

(注意:在包 sun.nio.fs 中找到(或未找到)所有检测器实现。)

我在使用 Ubuntu 20.04 的 docker 容器上遇到了同样的问题。通常一个容器非常小并且有一些非常特殊的工具。 我解决了通过 apt 命令安装 libmagic-mgc 和 libmagic1 包,其中包含用于检查文件 MimeType 的著名命令“file”。