根据文件头判断文件类型

2011-01-26 13:40:22

[code] package com; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class FileType { public final static Map<String, String> FILE_TYPE_MAP = new HashMap<String, String>(); private FileType(){} static{ getAllFileType(); //初始化文件类型信息 } /** * Discription:[getAllFileType,常见文件头信息] */ private static void getAllFileType() { FILE_TYPE_MAP.put(&#34;ffd8ffe000104a464946&#34;, &#34;jpg&#34;); //JPEG (jpg) FILE_TYPE_MAP.put(&#34;89504e470d0a1a0a0000&#34;, &#34;png&#34;); //PNG (png) FILE_TYPE_MAP.put(&#34;47494638396126026f01&#34;, &#34;gif&#34;); //GIF (gif) FILE_TYPE_MAP.put(&#34;49492a00227105008037&#34;, &#34;tif&#34;); //TIFF (tif) FILE_TYPE_MAP.put(&#34;424d228c010000000000&#34;, &#34;bmp&#34;); //16色位图(bmp) FILE_TYPE_MAP.put(&#34;424d8240090000000000&#34;, &#34;bmp&#34;); //24位位图(bmp) FILE_TYPE_MAP.put(&#34;424d8e1b030000000000&#34;, &#34;bmp&#34;); //256色位图(bmp) FILE_TYPE_MAP.put(&#34;41433130313500000000&#34;, &#34;dwg&#34;); //CAD (dwg) FILE_TYPE_MAP.put(&#34;3c21444f435459504520&#34;, &#34;html&#34;); //HTML (html) FILE_TYPE_MAP.put(&#34;3c21646f637479706520&#34;, &#34;htm&#34;); //HTM (htm) FILE_TYPE_MAP.put(&#34;48544d4c207b0d0a0942&#34;, &#34;css&#34;); //css FILE_TYPE_MAP.put(&#34;696b2e71623d696b2e71&#34;, &#34;js&#34;); //js FILE_TYPE_MAP.put(&#34;7b5c727466315c616e73&#34;, &#34;rtf&#34;); //Rich Text Format (rtf) FILE_TYPE_MAP.put(&#34;38425053000100000000&#34;, &#34;psd&#34;); //Photoshop (psd) FILE_TYPE_MAP.put(&#34;46726f6d3a203d3f6762&#34;, &#34;eml&#34;); //Email [Outlook Express 6] (eml) FILE_TYPE_MAP.put(&#34;d0cf11e0a1b11ae10000&#34;, &#34;doc&#34;); //MS Excel 注意:word、msi 和 excel的文件头一样 FILE_TYPE_MAP.put(&#34;d0cf11e0a1b11ae10000&#34;, &#34;vsd&#34;); //Visio 绘图 FILE_TYPE_MAP.put(&#34;5374616E64617264204A&#34;, &#34;mdb&#34;); //MS Access (mdb) FILE_TYPE_MAP.put(&#34;252150532D41646F6265&#34;, &#34;ps&#34;); FILE_TYPE_MAP.put(&#34;255044462d312e350d0a&#34;, &#34;pdf&#34;); //Adobe Acrobat (pdf) FILE_TYPE_MAP.put(&#34;2e524d46000000120001&#34;, &#34;rmvb&#34;); //rmvb/rm相同 FILE_TYPE_MAP.put(&#34;464c5601050000000900&#34;, &#34;flv&#34;); //flv与f4v相同 FILE_TYPE_MAP.put(&#34;00000020667479706d70&#34;, &#34;mp4&#34;); FILE_TYPE_MAP.put(&#34;49443303000000002176&#34;, &#34;mp3&#34;); FILE_TYPE_MAP.put(&#34;000001ba210001000180&#34;, &#34;mpg&#34;); // FILE_TYPE_MAP.put(&#34;3026b2758e66cf11a6d9&#34;, &#34;wmv&#34;); //wmv与asf相同 FILE_TYPE_MAP.put(&#34;52494646e27807005741&#34;, &#34;wav&#34;); //Wave (wav) FILE_TYPE_MAP.put(&#34;52494646d07d60074156&#34;, &#34;avi&#34;); FILE_TYPE_MAP.put(&#34;4d546864000000060001&#34;, &#34;mid&#34;); //MIDI (mid) FILE_TYPE_MAP.put(&#34;504b0304140000000800&#34;, &#34;zip&#34;); FILE_TYPE_MAP.put(&#34;526172211a0700cf9073&#34;, &#34;rar&#34;); FILE_TYPE_MAP.put(&#34;235468697320636f6e66&#34;, &#34;ini&#34;); FILE_TYPE_MAP.put(&#34;504b03040a0000000000&#34;, &#34;jar&#34;); FILE_TYPE_MAP.put(&#34;4d5a9000030000000400&#34;, &#34;exe&#34;);//可执行文件 FILE_TYPE_MAP.put(&#34;3c25402070616765206c&#34;, &#34;jsp&#34;);//jsp文件 FILE_TYPE_MAP.put(&#34;4d616e69666573742d56&#34;, &#34;mf&#34;);//MF文件 FILE_TYPE_MAP.put(&#34;3c3f786d6c2076657273&#34;, &#34;xml&#34;);//xml文件 FILE_TYPE_MAP.put(&#34;494e5345525420494e54&#34;, &#34;sql&#34;);//xml文件 FILE_TYPE_MAP.put(&#34;7061636b616765207765&#34;, &#34;java&#34;);//java文件 FILE_TYPE_MAP.put(&#34;406563686f206f66660d&#34;, &#34;bat&#34;);//bat文件 FILE_TYPE_MAP.put(&#34;1f8b0800000000000000&#34;, &#34;gz&#34;);//gz文件 FILE_TYPE_MAP.put(&#34;6c6f67346a2e726f6f74&#34;, &#34;properties&#34;);//bat文件 FILE_TYPE_MAP.put(&#34;cafebabe0000002e0041&#34;, &#34;class&#34;);//bat文件 FILE_TYPE_MAP.put(&#34;49545346030000006000&#34;, &#34;chm&#34;);//bat文件 FILE_TYPE_MAP.put(&#34;04000000010000001300&#34;, &#34;mxp&#34;);//bat文件 FILE_TYPE_MAP.put(&#34;504b0304140006000800&#34;, &#34;docx&#34;);//docx文件 FILE_TYPE_MAP.put(&#34;d0cf11e0a1b11ae10000&#34;, &#34;wps&#34;);//WPS文字wps、表格et、演示dps都是一样的 FILE_TYPE_MAP.put(&#34;6431303a637265617465&#34;, &#34;torrent&#34;); FILE_TYPE_MAP.put(&#34;6D6F6F76&#34;, &#34;mov&#34;); //Quicktime (mov) FILE_TYPE_MAP.put(&#34;FF575043&#34;, &#34;wpd&#34;); //WordPerfect (wpd) FILE_TYPE_MAP.put(&#34;CFAD12FEC5FD746F&#34;, &#34;dbx&#34;); //Outlook Express (dbx) FILE_TYPE_MAP.put(&#34;2142444E&#34;, &#34;pst&#34;); //Outlook (pst) FILE_TYPE_MAP.put(&#34;AC9EBD8F&#34;, &#34;qdf&#34;); //Quicken (qdf) FILE_TYPE_MAP.put(&#34;E3828596&#34;, &#34;pwl&#34;); //Windows Password (pwl) FILE_TYPE_MAP.put(&#34;2E7261FD&#34;, &#34;ram&#34;); //Real Audio (ram) } /** * 得到上传文件的文件头 * @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] &amp; 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 { FileInputStream 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 type = getFileType(&#34;C:/test/eee.WMV&#34;); System.out.println(&#34;eee.WMV : &#34;+type); System.out.println(); type = getFileType(&#34;C:/test/350996.wav&#34;); System.out.println(&#34;350996.wav : &#34;+type); System.out.println(); } } [/code] 收藏一下, 希望会有用. 有点不解的是, 我本地测试的一个F4V文件,文件头竟然和FLV的不一样, 但是,和MP4的文件头一样..囧.