根据文件头判断文件类型

10个字节判断

[java]  view plain  copy
  1. private static final HashMap<String, String> mFileTypes = new HashMap<String, String>();  
  2.         // judge file type by file header content  
  3.         static {  
  4.             mFileTypes.put("ffd8ffe000104a464946""jpg"); //JPEG (jpg)         
  5.             mFileTypes.put("89504e470d0a1a0a0000""png"); //PNG (png)         
  6.             mFileTypes.put("47494638396126026f01""gif"); //GIF (gif)         
  7.             mFileTypes.put("49492a00227105008037""tif"); //TIFF (tif)         
  8.             mFileTypes.put("424d228c010000000000""bmp"); //16色位图(bmp)         
  9.             mFileTypes.put("424d8240090000000000""bmp"); //24位位图(bmp)         
  10.             mFileTypes.put("424d8e1b030000000000""bmp"); //256色位图(bmp)         
  11.             mFileTypes.put("41433130313500000000""dwg"); //CAD (dwg)         
  12.             mFileTypes.put("3c21444f435459504520""html"); //HTML (html)    
  13.             mFileTypes.put("3c21646f637479706520""htm"); //HTM (htm)    
  14.             mFileTypes.put("48544d4c207b0d0a0942""css"); //css    
  15.             mFileTypes.put("696b2e71623d696b2e71""js"); //js    
  16.             mFileTypes.put("7b5c727466315c616e73""rtf"); //Rich Text Format (rtf)         
  17.             mFileTypes.put("38425053000100000000""psd"); //Photoshop (psd)         
  18.             mFileTypes.put("46726f6d3a203d3f6762""eml"); //Email [Outlook Express 6] (eml)           
  19.             mFileTypes.put("d0cf11e0a1b11ae10000""doc"); //MS Excel 注意:word、msi 和 excel的文件头一样         
  20.             mFileTypes.put("d0cf11e0a1b11ae10000""vsd"); //Visio 绘图         
  21.             mFileTypes.put("5374616E64617264204A""mdb"); //MS Access (mdb)          
  22.             mFileTypes.put("252150532D41646F6265""ps");  
  23.             mFileTypes.put("255044462d312e350d0a""pdf"); //Adobe Acrobat (pdf)       
  24.             mFileTypes.put("2e524d46000000120001""rmvb"); //rmvb/rm相同      
  25.             mFileTypes.put("464c5601050000000900""flv"); //flv与f4v相同      
  26.             mFileTypes.put("00000020667479706d70""mp4");  
  27.             mFileTypes.put("49443303000000002176""mp3");  
  28.             mFileTypes.put("000001ba210001000180""mpg"); //         
  29.             mFileTypes.put("3026b2758e66cf11a6d9""wmv"); //wmv与asf相同        
  30.             mFileTypes.put("52494646e27807005741""wav"); //Wave (wav)      
  31.             mFileTypes.put("52494646d07d60074156""avi");  
  32.             mFileTypes.put("4d546864000000060001""mid"); //MIDI (mid)       
  33.             mFileTypes.put("504b0304140000000800""zip");  
  34.             mFileTypes.put("526172211a0700cf9073""rar");  
  35.             mFileTypes.put("235468697320636f6e66""ini");  
  36.             mFileTypes.put("504b03040a0000000000""jar");  
  37.             mFileTypes.put("4d5a9000030000000400""exe");//可执行文件    
  38.             mFileTypes.put("3c25402070616765206c""jsp");//jsp文件    
  39.             mFileTypes.put("4d616e69666573742d56""mf");//MF文件    
  40.             mFileTypes.put("3c3f786d6c2076657273""xml");//xml文件    
  41.             mFileTypes.put("494e5345525420494e54""sql");//xml文件    
  42.             mFileTypes.put("7061636b616765207765""java");//java文件    
  43.             mFileTypes.put("406563686f206f66660d""bat");//bat文件    
  44.             mFileTypes.put("1f8b0800000000000000""gz");//gz文件    
  45.             mFileTypes.put("6c6f67346a2e726f6f74""properties");//bat文件    
  46.             mFileTypes.put("cafebabe0000002e0041""class");//bat文件    
  47.             mFileTypes.put("49545346030000006000""chm");//bat文件    
  48.             mFileTypes.put("04000000010000001300""mxp");//bat文件    
  49.             mFileTypes.put("504b0304140006000800""docx");//docx文件    
  50.             mFileTypes.put("d0cf11e0a1b11ae10000""wps");//WPS文字wps、表格et、演示dps都是一样的    
  51.             mFileTypes.put("6431303a637265617465""torrent");  
  52.   
  53.   
  54.             mFileTypes.put("6D6F6F76""mov"); //Quicktime (mov)      
  55.             mFileTypes.put("FF575043""wpd"); //WordPerfect (wpd)       
  56.             mFileTypes.put("CFAD12FEC5FD746F""dbx"); //Outlook Express (dbx)         
  57.             mFileTypes.put("2142444E""pst"); //Outlook (pst)          
  58.             mFileTypes.put("AC9EBD8F""qdf"); //Quicken (qdf)         
  59.             mFileTypes.put("E3828596""pwl"); //Windows Password (pwl)             
  60.             mFileTypes.put("2E7261FD""ram"); //Real Audio (ram)       
  61.             mFileTypes.put("null"null); //null  
  62.         }  
  63.   
  64.         public static String getFileType(String filePath) {  
  65.             return mFileTypes.get(getFileHeader(filePath));  
  66.         }  
  67.   
  68.         private static String getFileHeader(String filePath) {  
  69.             File file=new File(filePath);  
  70.             if(!file.exists() || file.length()<11){  
  71.                 return "null";  
  72.             }  
  73.             FileInputStream is = null;  
  74.             String value = null;  
  75.             try {  
  76.                 is = new FileInputStream(file);  
  77.                 byte[] b = new byte[10];  
  78.                 is.read(b, 0, b.length);  
  79.                 value = bytesToHexString(b);  
  80.             } catch (Exception e) {  
  81.             } finally {  
  82.                 if(null != is) {  
  83.                     try {  
  84.                         is.close();  
  85.                     } catch (IOException e) {}  
  86.                 }  
  87.             }  
  88.             return value;  
  89.         }  
  90.   
  91.         private static String bytesToHexString(byte[] src){  
  92.             StringBuilder stringBuilder = new StringBuilder();  
  93.             if (src == null || src.length <= 0) {  
  94.                 return null;  
  95.             }  
  96.             for (int i = 0; i < src.length; i++) {  
  97.                 int v = src[i] & 0xFF;  
  98.                 String hv = Integer.toHexString(v);  
  99.                 if (hv.length() < 2) {  
  100.                     stringBuilder.append(0);  
  101.                 }  
  102.                 stringBuilder.append(hv);  
  103.             }  
  104.             return stringBuilder.toString();  
  105.         }  

3个字节判断:

[java]  view plain  copy
  1. private static final HashMap<String, String> mFileTypes = new HashMap<String, String>();  
  2.        // judge file type by   
  3.        static {  
  4.            //images  
  5.            mFileTypes.put("FFD8FF""jpg");  
  6.            mFileTypes.put("89504E47""png");  
  7.            mFileTypes.put("47494638""gif");  
  8.            mFileTypes.put("49492A00""tif");  
  9.            mFileTypes.put("424D""bmp");  
  10.            //  
  11.            mFileTypes.put("41433130""dwg"); //CAD  
  12.            mFileTypes.put("38425053""psd");  
  13.            mFileTypes.put("7B5C727466""rtf"); //日记本  
  14.            mFileTypes.put("3C3F786D6C""xml");  
  15.            mFileTypes.put("68746D6C3E""html");  
  16.            mFileTypes.put("44656C69766572792D646174653A""eml"); //邮件  
  17.            mFileTypes.put("D0CF11E0""doc");  
  18.            mFileTypes.put("5374616E64617264204A""mdb");  
  19.            mFileTypes.put("252150532D41646F6265""ps");  
  20.            mFileTypes.put("255044462D312E""pdf");  
  21.            mFileTypes.put("504B0304""zip");  
  22.            mFileTypes.put("52617221""rar");  
  23.            mFileTypes.put("57415645""wav");  
  24.            mFileTypes.put("41564920""avi");  
  25.            mFileTypes.put("2E524D46""rm");  
  26.            mFileTypes.put("000001BA""mpg");  
  27.            mFileTypes.put("000001B3""mpg");  
  28.            mFileTypes.put("6D6F6F76""mov");  
  29.            mFileTypes.put("3026B2758E66CF11""asf");  
  30.            mFileTypes.put("4D546864""mid");  
  31.            mFileTypes.put("1F8B08""gz");  
  32.            mFileTypes.put("""");  
  33.        }  
  34.   
  35.        public static String getFileType(String filePath) {  
  36.            return mFileTypes.get(getFileHeader(filePath));  
  37.        }  
  38.        //获取文件头信息  
  39.        public static String getFileHeader(String filePath) {  
  40.           <pre name="code" class="java">          File file=new File(filePath);  
  41.            if(!file.exists() || file.length()<4){  
  42.                return "null";  
  43.            }  
  44.            FileInputStream is = null;  
  45.            String value = null;  
  46.            try {  
  47.                is = new FileInputStream(file);  
  48.                byte[] b = new byte[3];  
  49.                is.read(b, 0, b.length);  
  50.                value = bytesToHexString(b);  
  51.            } catch (Exception e) {  
  52.            } finally {  
  53.                if(null != is) {  
  54.                    try {  
  55.                        is.close();  
  56.                    } catch (IOException e) {}  
  57.                }  
  58.            }  
  59.            return value;  
  60.        }  
  61.   
  62.        private static String bytesToHexString(byte[] src){  
  63.            StringBuilder builder = new StringBuilder();  
  64.            if (src == null || src.length <= 0) {  
  65.                return null;  
  66.            }  
  67.            String hv;  
  68.            for (int i = 0; i < src.length; i++) {  
  69.                hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();  
  70.                if (hv.length() < 2) {  
  71.                    builder.append(0);  
  72.                }  
  73.                builder.append(hv);  
  74.            }  
  75.            return builder.toString();  
  76.        }  

 

优化处理:在不同的设备上同样类型的文件,文件头前面内容未必一致,可能只有前几个一致,后面就不同了(例如:jpg类型文件,在不同手机上,lennovo k900前10个是一致的,但是MI3只有前5个字符一致,后面是不一样的,所有一些情况进行特殊处理)当整个头文件失败后,在进行前5个字符截取对比处理,优化具体如下:

[java]  view plain  copy
  1. public static String getFileType(String filePath) {  
  2.             String keySearch=getFileHeader(filePath);  
  3.             String fileSuffix=mFileTypes.get(keySearch);  
  4.             //补充 这里并不是所有的文件格式前10 byte(jpg)都一致,前五个byte一致即可  
  5.             if(TextUtils.isEmpty(fileSuffix)){  
  6.                 Iterator<String> keyList=mFileTypes.keySet().iterator();  
  7.                 String key,keySearchPrefix=keySearch.substring(0,5);  
  8.                 while (keyList.hasNext()){  
  9.                     key=keyList.next();  
  10.                     if(key.contains(keySearchPrefix)) {  
  11.                         fileSuffix = mFileTypes.get(key);  
  12.                         break;  
  13.                     }  
  14.                 }  
  15.             }  
  16.             return fileSuffix;  
  17.         }  
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值