美文网首页
利用文件头来判断文件类型

利用文件头来判断文件类型

作者: 小玉1991 | 来源:发表于2021-02-24 21:23 被阅读0次

    利用文件头来实现的一些文件类型的方法封装

    package com.opslab.util.algorithmImpl;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    
    /**
    * 利用文件头来实现的一些文件类型的方法封装
    */
    public class FileTypeImpl {
    
    public final static Map<String,String> FILE_TYPE_MAP = new HashMap<String,String>();
    
    static {
    FILE_TYPE_MAP.put("jpg", "FFD8FF"); //JPEG (jpg)
    FILE_TYPE_MAP.put("png", "89504E47"); //PNG (png)
    FILE_TYPE_MAP.put("gif", "47494638"); //GIF (gif)
    FILE_TYPE_MAP.put("tif", "49492A00"); //TIFF (tif)
    FILE_TYPE_MAP.put("bmp", "424D"); //Windows Bitmap (bmp)
    FILE_TYPE_MAP.put("dwg", "41433130"); //CAD (dwg)
    FILE_TYPE_MAP.put("html", "68746D6C3E"); //HTML (html)
    FILE_TYPE_MAP.put("rtf", "7B5C727466"); //Rich Text Format (rtf)
    FILE_TYPE_MAP.put("xml", "3C3F786D6C");
    FILE_TYPE_MAP.put("zip", "504B0304");
    FILE_TYPE_MAP.put("rar", "52617221");
    FILE_TYPE_MAP.put("psd", "38425053"); //Photoshop (psd)
    FILE_TYPE_MAP.put("eml", "44656C69766572792D646174653A"); //Email [thorough only] (eml)
    FILE_TYPE_MAP.put("dbx", "CFAD12FEC5FD746F"); //Outlook Express (dbx)
    FILE_TYPE_MAP.put("pst", "2142444E"); //Outlook (pst)
    FILE_TYPE_MAP.put("xls", "D0CF11E0"); //MS Word
    FILE_TYPE_MAP.put("doc", "D0CF11E0"); //MS Excel 注意:word 和 excel的文件头一样
    FILE_TYPE_MAP.put("mdb", "5374616E64617264204A"); //MS Access (mdb)
    FILE_TYPE_MAP.put("wpd", "FF575043"); //WordPerfect (wpd)
    FILE_TYPE_MAP.put("eps", "252150532D41646F6265");
    FILE_TYPE_MAP.put("ps", "252150532D41646F6265");
    FILE_TYPE_MAP.put("pdf", "255044462D312E"); //Adobe Acrobat (pdf)
    FILE_TYPE_MAP.put("qdf", "AC9EBD8F"); //Quicken (qdf)
    FILE_TYPE_MAP.put("pwl", "E3828596"); //Windows Password (pwl)
    FILE_TYPE_MAP.put("wav", "57415645"); //Wave (wav)
    FILE_TYPE_MAP.put("avi", "41564920");
    FILE_TYPE_MAP.put("ram", "2E7261FD"); //Real Audio (ram)
    FILE_TYPE_MAP.put("rm", "2E524D46"); //Real Media (rm)
    FILE_TYPE_MAP.put("mpg", "000001BA"); //
    FILE_TYPE_MAP.put("mov", "6D6F6F76"); //Quicktime (mov)
    FILE_TYPE_MAP.put("asf", "3026B2758E66CF11"); //Windows Media (asf)
    FILE_TYPE_MAP.put("mid", "4D546864"); //MIDI (mid)
    }
    
    /**
    * Created on 2010-7-1
    * <p>Discription:[getFileByFile,获取文件类型,包括图片,若格式不是已配置的,则返回null]</p>
    *
    * @param file
    * @return fileType
    * @author:[shixing_11@sina.com]
    */
    public final static String getFileType(File file) {
    String filetype = null;
    byte[] b = new byte[50];
    try (
    InputStream is = new FileInputStream(file)
    ) {
    is.read(b);
    filetype = getFileTypeByStream(b);
    is.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    return filetype;
    }
    
    /**
    * Created on 2010-7-1
    * <p>Discription:[getFileTypeByStream]</p>
    *
    * @param b
    * @return fileType
    * @author:[shixing_11@sina.com]
    */
    public final static String getFileTypeByStream(byte[] b) {
    String filetypeHex = String.valueOf(getFileHexString(b));
    Iterator<Map.Entry<String,String>> entryiterator = FILE_TYPE_MAP.entrySet().iterator();
    while (entryiterator.hasNext()) {
    Map.Entry<String,String> entry = entryiterator.next();
    String fileTypeHexValue = entry.getValue();
    if (filetypeHex.toUpperCase().startsWith(fileTypeHexValue)) {
    return entry.getKey();
    }
    }
    return null;
    }
    
    /**
    * Created on 2010-7-1
    * <p>Discription:[getFileHexString]</p>
    *
    * @param b
    * @return fileTypeHex
    * @author:[shixing_11@sina.com]
    */
    public final static String getFileHexString(byte[] b) {
    StringBuilder stringBuilder = new StringBuilder();
    if (b == null || b.length <= 0) {
    return null;
    }
    for (int i = 0; i < b.length; i++) {
    int v = b[i] & 0xFF;
    String hv = Integer.toHexString(v);
    if (hv.length() < 2) {
    stringBuilder.append(0);
    }
    stringBuilder.append(hv);
    }
    return stringBuilder.toString();
    }
    }
    

    相关文章

      网友评论

          本文标题:利用文件头来判断文件类型

          本文链接:https://www.haomeiwen.com/subject/aarefltx.html