Java判断文件的真实类型

2,547 阅读1分钟

ImageIO判断图片类型

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

JDK内置了下面类型的ImageReader:

图像类型扩展名MIME类型魔数(十六进制)魔数(ASCII)
gifgifimage/gif474946373961GIF79a
bmpbmpimage/bmp424dBM
wbmpwbmpimage/vnd.wap.wbmp判断很复杂
pngpngimage/png、image/x-png89504e470d0a1a0a�PNG
jpg、jpegjpg、jpegimage/jpegffd8��
webpwebpimage/webp52494646{4字节文件大小}574542505650382056503858RIFF{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路径

参考

利用文件头标志判断文件类型