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

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

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

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 回帖 • 4 关注
  • 文件类型
    1 引用 • 5 回帖
  • 格式转换
    2 引用 • 5 回帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • 这样即使后缀不对也可以识别到了

  • DrJoseph

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

  • manyue

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

  • manyue

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

    %PDF-1.5

  • xjtushilei

    这个厉害了

推荐标签 标签

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    497 引用 • 934 回帖
  • HTML

    HTML5 是 HTML 下一个的主要修订版本,现在仍处于发展阶段。广义论及 HTML5 时,实际指的是包括 HTML、CSS 和 JavaScript 在内的一套技术组合。

    108 引用 • 295 回帖
  • Kotlin

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

    19 引用 • 33 回帖 • 78 关注
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖 • 2 关注
  • SOHO

    为成为自由职业者在家办公而努力吧!

    7 引用 • 55 回帖 • 1 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 285 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖
  • Mobi.css

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

    1 引用 • 6 回帖 • 765 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 761 关注
  • OpenCV
    15 引用 • 36 回帖 • 7 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 59 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 368 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 98 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 51 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    209 引用 • 2040 回帖
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 490 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 613 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    240 引用 • 224 回帖
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 76 关注
  • FlowUs

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

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

    1 引用 • 7 关注
  • 单点登录

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

    9 引用 • 25 回帖 • 6 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 519 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 4 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • Access
    1 引用 • 3 回帖 • 3 关注