java 根据头文件码判断文件类型

本贴最后更新于 2827 天前,其中的信息可能已经时移俗易

项目中遇到以下场景,远程文件服务器文件没有后缀名,下载完后无法打开文件!
现在要根据文件的头文件码来匹配对应的后缀名!这是一件神器的事,直接上代码!

package com.config; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class FileType { public final static Map<String, String> FILE_TYPE_MAP = new HashMap<String, String>(); private static FileInputStream is; private FileType() { } static { getAllFileType(); // 初始化文件类型信息 } /** * Discription:[getAllFileType,常见文件头信息] */ private static void getAllFileType() { FILE_TYPE_MAP.put("ffd8ffe000104a464946", "jpg"); // JPEG (jpg) FILE_TYPE_MAP.put("89504e470d0a1a0a0000", "png"); // PNG (png) FILE_TYPE_MAP.put("47494638396126026f01", "gif"); // GIF (gif) FILE_TYPE_MAP.put("49492a00227105008037", "tif"); // TIFF (tif) FILE_TYPE_MAP.put("424d228c010000000000", "bmp"); // 16色位图(bmp) FILE_TYPE_MAP.put("424d8240090000000000", "bmp"); // 24位位图(bmp) FILE_TYPE_MAP.put("424d8e1b030000000000", "bmp"); // 256色位图(bmp) FILE_TYPE_MAP.put("41433130313500000000", "dwg"); // CAD (dwg) FILE_TYPE_MAP.put("3c21444f435459504520", "html"); // HTML (html) FILE_TYPE_MAP.put("3c21646f637479706520", "htm"); // HTM (htm) FILE_TYPE_MAP.put("48544d4c207b0d0a0942", "css"); // css FILE_TYPE_MAP.put("696b2e71623d696b2e71", "js"); // js FILE_TYPE_MAP.put("7b5c727466315c616e73", "rtf"); // Rich Text Format (rtf) FILE_TYPE_MAP.put("38425053000100000000", "psd"); // Photoshop (psd) FILE_TYPE_MAP.put("46726f6d3a203d3f6762", "eml"); // Email [Outlook Express 6] (eml) FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "doc"); // MS Excel 注意:word、msi 和 excel的文件头一样 FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "vsd"); // Visio 绘图 FILE_TYPE_MAP.put("5374616E64617264204A", "mdb"); // MS Access (mdb) FILE_TYPE_MAP.put("252150532D41646F6265", "ps"); FILE_TYPE_MAP.put("255044462d312e350d0a", "pdf"); // Adobe Acrobat (pdf) FILE_TYPE_MAP.put("2e524d46000000120001", "rmvb"); // rmvb/rm相同 FILE_TYPE_MAP.put("464c5601050000000900", "flv"); // flv与f4v相同 FILE_TYPE_MAP.put("00000020667479706d70", "mp4"); FILE_TYPE_MAP.put("49443303000000002176", "mp3"); FILE_TYPE_MAP.put("000001ba210001000180", "mpg"); // FILE_TYPE_MAP.put("3026b2758e66cf11a6d9", "wmv"); // wmv与asf相同 FILE_TYPE_MAP.put("52494646e27807005741", "wav"); // Wave (wav) FILE_TYPE_MAP.put("52494646d07d60074156", "avi"); FILE_TYPE_MAP.put("4d546864000000060001", "mid"); // MIDI (mid) FILE_TYPE_MAP.put("504b0304140000000800", "zip"); FILE_TYPE_MAP.put("526172211a0700cf9073", "rar"); FILE_TYPE_MAP.put("235468697320636f6e66", "ini"); FILE_TYPE_MAP.put("504b03040a0000000000", "jar"); FILE_TYPE_MAP.put("4d5a9000030000000400", "exe");// 可执行文件 FILE_TYPE_MAP.put("3c25402070616765206c", "jsp");// jsp文件 FILE_TYPE_MAP.put("4d616e69666573742d56", "mf");// MF文件 FILE_TYPE_MAP.put("3c3f786d6c2076657273", "xml");// xml文件 FILE_TYPE_MAP.put("494e5345525420494e54", "sql");// xml文件 FILE_TYPE_MAP.put("7061636b616765207765", "java");// java文件 FILE_TYPE_MAP.put("406563686f206f66660d", "bat");// bat文件 FILE_TYPE_MAP.put("1f8b0800000000000000", "gz");// gz文件 FILE_TYPE_MAP.put("6c6f67346a2e726f6f74", "properties");// bat文件 FILE_TYPE_MAP.put("cafebabe0000002e0041", "class");// bat文件 FILE_TYPE_MAP.put("49545346030000006000", "chm");// bat文件 FILE_TYPE_MAP.put("04000000010000001300", "mxp");// bat文件 FILE_TYPE_MAP.put("504b0304140006000800", "docx");// docx文件 FILE_TYPE_MAP.put("d0cf11e0a1b11ae10000", "wps");// WPS文字wps、表格et、演示dps都是一样的 FILE_TYPE_MAP.put("6431303a637265617465", "torrent"); FILE_TYPE_MAP.put("6D6F6F76", "mov"); // Quicktime (mov) FILE_TYPE_MAP.put("FF575043", "wpd"); // WordPerfect (wpd) FILE_TYPE_MAP.put("CFAD12FEC5FD746F", "dbx"); // Outlook Express (dbx) FILE_TYPE_MAP.put("2142444E", "pst"); // Outlook (pst) FILE_TYPE_MAP.put("AC9EBD8F", "qdf"); // Quicken (qdf) FILE_TYPE_MAP.put("E3828596", "pwl"); // Windows Password (pwl) FILE_TYPE_MAP.put("2E7261FD", "ram"); // Real Audio (ram) FILE_TYPE_MAP.put("2321414D520A", "amr"); //AMR } /** * 得到上传文件的文件头 * * @param src * @return */ public static String bytesToHexString(byte[] src) { StringBuilder stringBuilder = new StringBuilder(); if (src == null || src.length <= 0) { return null; } for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } return stringBuilder.toString(); } /** * 根据制定文件的文件头判断其文件类型 * * @param filePaht * @return */ public static String getFileType(String filePaht) { String res = null; try { is = new FileInputStream(filePaht); byte[] b = new byte[10]; is.read(b, 0, b.length); String fileCode = bytesToHexString(b); // System.out.println(fileCode); // 这种方法在字典的头代码不够位数的时候可以用但是速度相对慢一点 Iterator<String> keyIter = FILE_TYPE_MAP.keySet().iterator(); while (keyIter.hasNext()) { String key = keyIter.next(); if (key.toLowerCase().startsWith(fileCode.toLowerCase()) || fileCode.toLowerCase().startsWith(key.toLowerCase())) { res = FILE_TYPE_MAP.get(key); break; } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return res; } public static void main(String[] args) throws Exception { //注意:测试时故意把文件后缀给去掉,模拟从远程文件服务器下载的文件 String fileType = getFileType("C:/Users/Administrator/Desktop/word");//word文档 System.out.println("The file format of word is:" + fileType); fileType = getFileType("C:/Users/Administrator/Desktop/image");//图片 System.out.println("The file format of image is:" + fileType); fileType = getFileType("C:/Users/Administrator/Desktop/record");//录音 System.out.println("The file format of record is:" + fileType); } }

运行结果:

The file format of word is:docx The file format of image is:jpg The file format of record is:amr

有任何问题欢迎跟帖交流 0.0

参考资料:
http://android.amberfog.com/?p=181
http://blog.csdn.net/soft_fa/article/details/50752669
http://www.xuebuyuan.com/1734997.html
http://blog.csdn.net/li396864285/article/details/52767447
http://blog.csdn.net/bestcxx/article/details/51895839
http://linjie.org/2015/08/06/amr%E6%A0%BC%E5%BC%8F%E8%BD%ACmp3%E6%A0%BC%E5%BC%8F-%E5%AE%8C%E7%BE%8E%E8%A7%A3%E5%86%B3Linux%E4%B8%8B%E8%BD%AC%E6%8D%A20K%E9%97%AE%E9%A2%98/

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8216 回帖 • 3 关注
  • 文件类型
    1 引用 • 5 回帖
  • 格式转换
    2 引用 • 5 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • Vanessa via macOS

    这样即使后缀不对也可以识别到了

  • DrJoseph

    之前接触到过文件后缀缺失,让我们还原成最初的文件状态的,其中的一个方法就是通过头文件码判断类型手动加后缀,学习了

  • manyue

    这个好,回头要试试,我们现在根据 MIME 判断有缺陷

  • manyue

    我这边试了下,PDF 文件头编码是

    %PDF-1.5

  • xjtushilei

    这个厉害了

推荐标签 标签

  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    54 引用 • 44 回帖
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    370 引用 • 1847 回帖 • 1 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    78 引用 • 396 回帖 • 1 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 2 关注
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 637 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 75 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 614 关注
  • 导航

    各种网址链接、内容导航。

    44 引用 • 177 回帖 • 1 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 158 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 448 关注
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 1 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 254 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 143 回帖
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖 • 3 关注
  • AWS
    11 引用 • 28 回帖 • 6 关注
  • Anytype
    3 引用 • 31 回帖 • 17 关注
  • Excel
    31 引用 • 28 回帖
  • 反馈

    Communication channel for makers and users.

    121 引用 • 907 回帖 • 277 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 183 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 2 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 110 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 4 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 556 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 762 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    118 引用 • 54 回帖
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖