ImageIO判断图片类型

ImageInputStream image = ImageIO.createImageInputStream(in);
Iterator<ImageReader> readers = ImageIO.getImageReaders(image);
readers.next().getFormatName();

JDK内置了下面类型的ImageReader:

图像类型

扩展名

MIME类型

魔数(十六进制)

魔数(ASCII)

gif

gif

image/gif

474946373961

GIF79a

bmp

bmp

image/bmp

424d

BM

wbmp

wbmp

image/vnd.wap.wbmp

判断很复杂

png

png

image/png、image/x-png

89504e470d0a1a0a

�PNG

jpg、jpeg

jpg、jpeg

image/jpeg

ffd8

��

webp

webp

image/webp

52494646{4字节文件大小}574542505650382056503858

RIFF{4字节文件大小}WEBPVP8 VP8X

我们可以通过JNI + ServiceLoader支持新的文件类型,参考Webp扩展:Web-imageio

Files判断文件类型

public class Files {
    ...
    public static String probeContentType(Path path) {
        ...
    }
    ...
}

通过FileTypeDetector进行文件类型的检测,可能是只检查文件名称、或者检查文件属性或者文件的字节,但是目前看java中只实现了检查文件名称的方式,还需要在${user.home}/.mime.types中配置扩展名到mime type的映射.

通过Linux的工具file

file --mime-type <待判断的文件>
file -m <magic文件或者目录> --mime-type <待判断的文件>

该工具通过解析文件内容来判断文件的真实类型,我们可以通过Java Runtime工具来对该工具实现调用。

该工具依赖于/usr/share/file/magic.mgc文件或者/usr/share/file/magic目录,magic文件里定义了文件类型判断的规则,注意不同版本的file工具的magic文件可能存在不兼容的情况。

源码地址:Linux file工具 github路径

参考