Java 如何通过Magic 魔数获取文件类型

 更新时间:2023年11月29日 10:27:38   作者:数媒派  
魔数有很多种定义,这里我们讨论的主要是在编程领域的定义,文件的起始几个字节的内容是固定的,本文给大家介绍Java Magic 魔数获取文件类型的相关知识,感兴趣的朋友一起看看吧

Magic 魔数获取文件类型

魔数有很多种定义,这里我们讨论的主要是在编程领域的定义,文件的起始几个字节的内容是固定的(或是有意填充,或是本就如此),这几个字节的内容也被称为魔数(magic number),因此可以根据这几个字节的内容确定文件类型。

常见文件类型的魔数

public enum FileType {
    /**
     * JPEG
     */
    JPEG("JPEG", "FFD8FF"),
    /**
     * PNG
     */
    PNG("PNG", "89504E47"),
    /**
     * GIF
     */
    GIF("GIF", "47494638"),
    /**
     * TIFF
     */
    TIFF("TIFF", "49492A00"),
    /**
     * Windows bitmap
     */
    BMP("BMP", "424D"),
    /**
     * CAD
     */
    DWG("DWG", "41433130"),
    /**
     * Adobe photoshop
     */
    PSD("PSD", "38425053"),
    /**
     * Rich Text Format
     */
    RTF("RTF", "7B5C727466"),
    /**
     * XML
     */
    XML("XML", "3C3F786D6C"),
    /**
     * HTML
     */
    HTML("HTML", "68746D6C3E"),
    /**
     * Outlook Express
     */
    DBX("DBX", "CFAD12FEC5FD746F "),
    /**
     * Outlook
     */
    PST("PST", "2142444E"),
    /**
     * doc;xls;dot;ppt;xla;ppa;pps;pot;msi;sdw;db
     */
    OLE2("OLE2", "0xD0CF11E0A1B11AE1"),
    /**
     * Microsoft Word/Excel
     */
    XLS_DOC("XLS_DOC", "D0CF11E0"),
    /**
     * Microsoft Access
     */
    MDB("MDB", "5374616E64617264204A"),
    /**
     * Word Perfect
     */
    WPB("WPB", "FF575043"),
    /**
     * Postscript
     */
    EPS_PS("EPS_PS", "252150532D41646F6265"),
    /**
     * Adobe Acrobat
     */
    PDF("PDF", "255044462D312E"),
    /**
     * Windows Password
     */
    PWL("PWL", "E3828596"),
    /**
     * ZIP Archive
     */
    ZIP("ZIP", "504B0304"),
    /**
     * ARAR Archive
     */
    RAR("RAR", "52617221"),
    /**
     * WAVE
     */
    WAV("WAV", "57415645"),
    /**
     * AVI
     */
    AVI("AVI", "41564920"),
    /**
     * Real Audio
     */
    RAM("RAM", "2E7261FD"),
    /**
     * Real Media
     */
    RM("RM", "2E524D46"),
    /**
     * Quicktime
     */
    MOV("MOV", "6D6F6F76"),
    /**
     * Windows Media
     */
    ASF("ASF", "3026B2758E66CF11"),
    /**
     * MIDI
     */
    MID("MID", "4D546864");
    private String key;
    private String value;
    FileType(String key, String value) {
        this.key = key;
        this.value = value;
    }
    public String getValue() {
        return value;
    }
    public String getKey() {
         return key;
    }
}

文件类型工具类

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class FileUtil {
    /**
     * 获取文件投
     *
     * @param filePath 文件路径
     * @return 16 进制的文件投信息
     * @throws IOException
     */
    private static String getFileHeader(String filePath) throws IOException {
        byte[] b = new byte[28];
        InputStream inputStream = new FileInputStream(filePath);
        inputStream.read(b, 0, 28);
        inputStream.close();
        return bytes2hex(b);
    }
    /**
     * 将字节数组转换成16进制字符串
     */
    private static String bytes2hex(byte[] src) {
        StringBuilder stringBuilder = new StringBuilder("");
        if (src == null || src.length <= 0) {
            return null;
        }
        for (byte b : src) {
            int v = b & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }
    /**
     * 根据文件路径获取文件类型
     *
     * @param filePath 文件路径
     * @return 文件类型
     * @throws IOException
     */
    public static FileType getFileType(String filePath) throws IOException {
        String fileHead = getFileHeader(filePath);
        if (null == fileHead || fileHead.length() == 0) {
            return null;
        }
        fileHead = fileHead.toUpperCase();
        FileType[] fileTypes = FileType.values();
        for (FileType type : fileTypes) {
            if (fileHead.startsWith(type.getValue())) {
                return type;
            }
        }
        return null;
    }
}

使用

public static void main(String[] args) throws IOException {
    String filePath = "/Users/ziyou/Downloads/SpringBoot实战.png";
    FileType fileType = getFileType(filePath);
    System.out.println(fileType.getKey());
}

到此这篇关于Java Magic 魔数获取文件类型的文章就介绍到这了,更多相关Java获取文件类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文快速掌握Java中的搜索算法和排序算法

    一文快速掌握Java中的搜索算法和排序算法

    这篇文章主要为大家详细介绍了Java中常用的搜索算法和排序算法的实现,例如二分查找、冒泡排序、选择排序等,文中的示例代码讲解详细,希望对大家有所帮助
    2023-04-04
  • 使用Java和SpringBoot实现服务器发送事件(Server-Sent Events)

    使用Java和SpringBoot实现服务器发送事件(Server-Sent Events)

    使用Java开发web应用,大多数时候我们提供的接口返回数据都是一次性完整返回,有些时候,我们也需要提供流式接口持续写出数据,以下提供一种简单的方式,本文给大家介绍了如何在Java web中实现服务器发送事件,需要的朋友可以参考下
    2024-02-02
  • 2024版本IDEA创建Servlet模板的图文教程

    2024版本IDEA创建Servlet模板的图文教程

    新版IDEA 2024.1.4中,用户需要自行创建Servlet模板以解决Web项目无法通过右键创建Servlet的问题,本文详细介绍了添加ServletAnnotatedClass.java模板的步骤,帮助用户快速配置并使用新的Servlet模板,需要的朋友可以参考下
    2024-10-10
  • 利用Java编写一个出敬业福的小程序

    利用Java编写一个出敬业福的小程序

    新年将至,又开始扫福活动,每年的敬业福成了大家难过的坎。所以本文将介绍一个通过Java编写的一款福字生成器,感兴趣的小伙伴可以试一试
    2022-01-01
  • SpringBoot接入钉钉自定义机器人预警通知

    SpringBoot接入钉钉自定义机器人预警通知

    本文主要介绍了SpringBoot接入钉钉自定义机器人预警通知,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • Springboot应用中线程池配置详细教程(最新2021版)

    Springboot应用中线程池配置详细教程(最新2021版)

    这篇文章主要介绍了Springboot应用中线程池配置教程(2021版),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 【spring-boot】快速构建spring-boot微框架的方法

    【spring-boot】快速构建spring-boot微框架的方法

    本篇文章主要介绍了【spring-boot】快速构建spring-boot微框架的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 通过实例学习Either 树和模式匹配

    通过实例学习Either 树和模式匹配

    这篇文章主要介绍了通过实例学习Either 树和模式匹配,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • Java 包和访问权限操作

    Java 包和访问权限操作

    这篇文章主要介绍了Java 包和访问权限操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • SpringBoot参数校验之@Valid的使用详解

    SpringBoot参数校验之@Valid的使用详解

    这篇文章主要通过示例为大家详细介绍一下介绍了SpringBoot参数校验中@Valid的使用方法,文中的示例代码讲解详细,需要的可以参考一下
    2022-06-06

最新评论