Java根据文件头获取文件类型

  文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation)。
  为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式。具体代码如下:
  Java代码 :

  1 import java.io.FileInputStream;
  2 import java.io.IOException;
  3 import java.util.HashMap;
  4 
  5 /**
  6  * 获取和判断文件头信息
  7  * @create Victoria 201401 copy from Internet by bigbird
  8  */
  9 public class FileType {
 10     // 缓存文件头信息-文件头信息
 11     public static final HashMap<String, String> mFileTypes = new HashMap<String, String>();
 12     static {
 13         // images
 14         mFileTypes.put("FFD8FF", "jpg");
 15         mFileTypes.put("89504E47", "png");
 16         mFileTypes.put("47494638", "gif");
 17         mFileTypes.put("49492A00", "tif");
 18         mFileTypes.put("424D", "bmp");
 19         //
 20         mFileTypes.put("41433130", "dwg"); // CAD
 21         mFileTypes.put("38425053", "psd");
 22         mFileTypes.put("7B5C727466", "rtf"); // 日记本
 23         mFileTypes.put("3C3F786D6C", "xml");
 24         mFileTypes.put("68746D6C3E", "html");
 25         mFileTypes.put("44656C69766572792D646174653A", "eml"); // 邮件
 26         mFileTypes.put("D0CF11E0", "doc");
 27         mFileTypes.put("5374616E64617264204A", "mdb");
 28         mFileTypes.put("252150532D41646F6265", "ps");
 29         mFileTypes.put("255044462D312E", "pdf");
 30         mFileTypes.put("504B0304", "docx");
 31         mFileTypes.put("52617221", "rar");
 32         mFileTypes.put("57415645", "wav");
 33         mFileTypes.put("41564920", "avi");
 34         mFileTypes.put("2E524D46", "rm");
 35         mFileTypes.put("000001BA", "mpg");
 36         mFileTypes.put("000001B3", "mpg");
 37         mFileTypes.put("6D6F6F76", "mov");
 38         mFileTypes.put("3026B2758E66CF11", "asf");
 39         mFileTypes.put("4D546864", "mid");
 40         mFileTypes.put("1F8B08", "gz");
 41         mFileTypes.put("", "");
 42         mFileTypes.put("", "");
 43     }
 44 
 45     /**
 46      * 根据文件路径获取文件头信息
 47      * 
 48      * @param filePath
 49      *            文件路径
 50      * @return 文件头信息
 51      */
 52     public static String getFileType(String filePath) {
 53         return mFileTypes.get(getFileHeader(filePath));
 54     }
 55 
 56     /**
 57      * 根据文件路径获取文件头信息
 58      * 
 59      * @param filePath
 60      *            文件路径
 61      * @return 文件头信息
 62      */
 63     public static String getFileHeader(String filePath) {
 64         FileInputStream is = null;
 65         String value = null;
 66         try {
 67             is = new FileInputStream(filePath);
 68             byte[] b = new byte[4];
 69             is.read(b, 0, b.length);
 70             value = bytesToHexString(b);
 71         } catch (Exception e) {
 72         } finally {
 73             if (null != is) {
 74                 try {
 75                     is.close();
 76                 } catch (IOException e) {
 77                 }
 78             }
 79         }
 80         return value;
 81     }
 82 
 83     /**
 84      * 将要读取文件头信息的文件的byte数组转换成string类型表示
 85      * 
 86      * @param src
 87      *            要读取文件头信息的文件的byte数组
 88      * @return 文件头信息
 89      */
 90     private static String bytesToHexString(byte[] src) {
 91         StringBuilder builder = new StringBuilder();
 92         if (src == null || src.length <= 0) {
 93             return null;
 94         }
 95         String hv;
 96         for (int i = 0; i < src.length; i++) {
 97             // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
 98             hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();
 99             if (hv.length() < 2) {
100                 builder.append(0);
101             }
102             builder.append(hv);
103         }
104         return builder.toString();
105     }
106 
107     public static void main(String[] args) throws Exception {
108         final String fileType = getFileType("E:/读书笔记/Java编程思想读书笔记.docx");
109         System.out.println(fileType);
110     }
111 }

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。