代码如下:

importjava.io.FileInputStream;importjava.io.IOException;importjava.util.HashMap;/***

* 类描述:获取和判断文件头信息

* |--文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。

* |--头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现(implementation)。

* |--为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式。*/

public classCheckFileFormatUtil {//缓存文件头信息-文件头信息

private static final HashMap mFileTypes = new HashMap();static{//images

mFileTypes.put("FFD8FF", "jpg");

mFileTypes.put("89504E47", "png");

mFileTypes.put("47494638", "gif");

mFileTypes.put("49492A00", "tif");

mFileTypes.put("424D", "bmp");// mFileTypes.put("41433130", "dwg"); //CAD

mFileTypes.put("38425053", "psd");

mFileTypes.put("7B5C727466", "rtf"); //日记本

mFileTypes.put("3C3F786D6C", "xml");

mFileTypes.put("68746D6C3E", "html");

mFileTypes.put("44656C69766572792D646174653A", "eml"); //邮件

mFileTypes.put("D0CF11E0", "doc");

mFileTypes.put("D0CF11E0", "ppt");

mFileTypes.put("D0CF11E0", "xls");//excel2003版本文件

mFileTypes.put("5374616E64617264204A", "mdb");

mFileTypes.put("252150532D41646F6265", "ps");

mFileTypes.put("255044462D312E", "pdf");

mFileTypes.put("504B0304", "pptx");

mFileTypes.put("504B0304", "docx");

mFileTypes.put("504B0304", "xlsx");//excel2007以上版本文件

mFileTypes.put("52617221", "rar");

mFileTypes.put("57415645", "wav");

mFileTypes.put("41564920", "avi");

mFileTypes.put("2E524D46", "rm");

mFileTypes.put("000001BA", "mpg");

mFileTypes.put("000001B3", "mpg");

mFileTypes.put("6D6F6F76", "mov");

mFileTypes.put("3026B2758E66CF11", "asf");

mFileTypes.put("4D546864", "mid");

mFileTypes.put("1F8B08", "gz");

}/***@paramfilePath 文件路径

*@return文件头信息

*@authorwlx

*

* 方法描述:根据文件路径获取文件头信息*/

public staticString getFileType(String filePath) {//System.out.println(getFileHeader(filePath));//System.out.println(mFileTypes.get(getFileHeader(filePath)));

returnmFileTypes.get(getFileHeader(filePath));

}/***@paramfilePath 文件路径

*@return文件头信息

*@authorwlx

*

* 方法描述:根据文件路径获取文件头信息*/

public staticString getFileHeader(String filePath) {

FileInputStream is= null;

String value= null;try{

is= newFileInputStream(filePath);byte[] b = new byte[4];/** int read() 从此输入流中读取一个数据字节。int read(byte[] b) 从此输入流中将最多 b.length

* 个字节的数据读入一个 byte 数组中。 int read(byte[] b, int off, int len)

* 从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。*/is.read(b,0, b.length);

value=bytesToHexString(b);

}catch(Exception e) {

e.printStackTrace();

}finally{if (null !=is) {try{

is.close();

}catch(IOException e) {

e.printStackTrace();

}

}

}returnvalue;

}/***@paramsrc 要读取文件头信息的文件的byte数组

*@return文件头信息

*@authorwlx

*

* 方法描述:将要读取文件头信息的文件的byte数组转换成string类型表示*/

private static String bytesToHexString(byte[] src) {

StringBuilder builder= newStringBuilder();if (src == null || src.length <= 0) {return null;

}

String hv;for (byteaSrc : src) {//以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写

hv = Integer.toHexString(aSrc & 0xFF).toUpperCase();if (hv.length() < 2) {

builder.append(0);

}

builder.append(hv);

}//System.out.println(builder.toString());

returnbuilder.toString();

}public static void main(String[] args) throwsException {final String fileType = getFileType("E:\\项目管理清单.xlsx");

System.out.println(fileType);

System.out.println(getFileHeader("E:\\项目管理清单.xlsx"));

}

}

View Code

附录:魔数简介

很多类型的文件,其起始的几个字节的内容是固定的(或是有意填充,或是本就如此)。

根据这几个字节的内容就可以确定文件类型,因此这几个字节的内容被称为魔数 (magic number)。

JPEG jpg;jpeg 0xFFD8FF

PNG png 0x89504E470D0A1A0A

GIF gif GIF8

TIFF tif;tiff 0x49492A00

TIFF tif;tiff 0x4D4D002A

AOL ART art 0x4A47040E000000

AOL ART art 0x4A47030E000000

PC Paintbrush pcx 0x0A050108

Graphics Metafile wmf 0xD7CDC69A

Graphics Metafile wmf 0x01000900

Graphics Metafile wmf 0x02000900

Enhanced Metafile emf 0x0100000058000000

CAD dwg 0x41433130

Outlook Express dbx 0xCFAD12FE

MS Office/OLE2 doc;xls;dot;ppt;xla;ppa;pps;pot;msi;sdw;db 0xD0CF11E0A1B11AE1

WordPerfect wpd 0xFF575043

Quicken qdf 0xAC9EBD8F

QuickBooks Backup qbb 0x458600000600

Sage sly.or.srt.or.slt;sly;srt;slt 0x53520100

Lotus WordPro v9 lwp 0x576F726450726F

Lotus 123 v9 123 0x00001A00051004

Lotus 123 v5 wk4 0x00001A0002100400

Lotus 123 v3 wk3 0x00001A0000100400

Lotus 123 v1 wk1 0x2000604060

Windows Password pwl 0xE3828596

ZIP Archive zip;jar 0x504B0304

ZIP Archive (outdated) zip 0x504B3030

GZ Archive gz;tgz 0x1F8B08

ARJ Archive arj 0x60EA

MPEG mpg;mpeg 0x000001BA

MPEG mpg;mpeg 0x000001B3

Windows Media asf 0x3026B2758E66CF11

ELF Executable elf;; 0x7F454C4601010100

Java-Class class 0xCAFEBABE

java 校验文件类型_java判断文件真实类型相关推荐

  1. python判断图片类型_Python判断图片真实类型

    仅仅根据文件后缀判断文件类型显然不准,在python有一个内置模块imghdr可以用来判断图片的真实类型.代码如下: import imghdr imgType = imghdr.what(image ...

  2. python打开一个不存在的文件时-python判断文件是否存在,不存在就创建一个的实例...

    python判断文件是否存在,不存在就创建一个的实例 如下所示: try: f =open("D:/1.txt",'r') f.close() except IOError: f ...

  3. php存在文件夹_PHP创建文件夹 PHP判断文件夹文件是否存在

    这篇文章主要为大家详细介绍了PHP创建文件夹 PHP判断文件夹文件是否存在,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴. PHP如何创建文件夹?PHP如何判断文 ...

  4. Hdfs系列之:查看hdfs文件状态,判断文件是否损坏,修复hdfs损坏文件

    Hdfs系列之:查看hdfs文件状态,判断文件是否损坏,修复hdfs损坏文件 一.查看Hdfs文件状态 二.参数详解 三.修复hdfs损坏文件 一.查看Hdfs文件状态 命令格式为: hdfs fsc ...

  5. java校验文件格式_Java 判断文件是否为文本格式,并获取文件编码格式,读取内容!...

    我们经常会遇到读取文件内容的情况,就需要判断文件是否为文本文件,及文件编码格式,防止无法读取内容或乱码出现情况. 根据文件扩展名判定不太准确,可能会遇到未知扩展名或被修改了扩展名,下面的测试类使用文件 ...

  6. java 文件类型判断_Java:判断文件类型(支持网络文件)

    根据文件后缀来判断文件类型,往往是不靠谱的,因为要考虑到,可能人为的更改文件后缀,导致一些问题. 因此,下面是详细的根据文件头信息来判断文件类型. 文件头的十六进制以后继续补充. package co ...

  7. java 多种类型文件复制_java多种文件复制方式以及效率比较

    1.背景 java复制文件的方式其实有很多种,可以分为 传统的字节流读写复制FileInputStream,FileOutputStream,BufferedInputStream,BufferedO ...

  8. java 文件头 文件类型 files_根据文件头数据判断文件类型

    现有一文件,其扩展名未知或标记错误.假设它是一个正常的.非空的文件,且将扩展名更正后可以正常使用,那么,如何判断它是哪种类型的文件? 在后缀未知,或者后缀被修改的文件,依然通过文件头来判断该文件究竟是 ...

  9. java 判断是否为cst格式_Java判断文件编码格式

    1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK. 按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理 ...

最新文章

  1. 将输入字符串t中从第m个字符开始的全部字符复制到字符串s中_leetcode第32双周赛第二题leetcode1540. K 次操作转变字符串...
  2. 在阅读文献中提高升华自己--转
  3. python3精要(20)-函数(1)
  4. 利用WinPcap技术捕获数据包
  5. 剑指offer(15)反转链表
  6. 5·19网络故障:DNS服务器被攻击
  7. Android调试神器stetho使用详解和改造
  8. LDA话题模型与推荐系统
  9. 环境变量配置为jdk8,却显示java版本为jdk7
  10. OsgEarth下实现雷达波束扫描飞机动画
  11. 物联网和工业物联网有什么区别?
  12. iphone之参数知识(一)
  13. 基于QT的英文文献的编辑与检索系统的实现
  14. css中repeat用法,CSS background-repeat用法及代码示例
  15. 推荐一个可以在电脑上玩所有下载渠道手游的安卓模拟器
  16. 毒舌电影 是怎么成长起来的?为什么这么快就被封了
  17. css:绘制一角是圆角的三角形
  18. php返回值乱码,php中文返回乱码怎么办
  19. Ghost超级技巧一家亲
  20. 有关三年级计算机课的日记,有趣的一节课日记 三年级日记

热门文章

  1. c语言输入姓名输出姓和名_C输入和输出
  2. 微信团队七大价值观和产品观:对人性的洞察如此恐怖!
  3. 各国开发者 2022 薪资水平:Go 收入最高!
  4. Java版spring cloud 企业工程项目管理系统平台源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
  5. iuyoiu9898
  6. android 画虚线 以及部分手机不显示问题
  7. Mac软件及其插件推荐(持续更新)
  8. 嵌入式基于Flash上的文件系统
  9. file input 点击没反应_解决input file按钮要点击两次才弹出选择文件窗口
  10. 【nestjs+mongodb】- 后端搭建和数据库抽离