• 用java流方式判断文件类型


    这个方法只能在有限的范围内有效。并不是万金油

    比如

    图片类型判断,音频文件格式判断,视频文件格式判断等这种肯定是2进制且专业性很强的文件类型判断。

    下面给出完整版代码

    首先是文件类型枚取

    package org.filetype;
    
    /**
     * 文件类型枚取
     */
    public enum FileType {
    	
    	/**
    	 * JEPG.
    	 */
    	JPEG("FFD8FF"),
    	
    	/**
    	 * PNG.
    	 */
    	PNG("89504E47"),
    	
    	/**
    	 * GIF.
    	 */
    	GIF("47494638"),
    	
    	/**
    	 * TIFF.
    	 */
    	TIFF("49492A00"),
    	
    	/**
    	 * Windows Bitmap.
    	 */
    	BMP("424D"),
    	
    	/**
    	 * CAD.
    	 */
    	DWG("41433130"),
    	
    	/**
    	 * Adobe Photoshop.
    	 */
    	PSD("38425053"),
    	
    	/**
    	 * Rich Text Format.
    	 */
    	RTF("7B5C727466"),
    	
    	/**
    	 * XML.
    	 */
    	XML("3C3F786D6C"),
    	
    	/**
    	 * HTML.
    	 */
    	HTML("68746D6C3E"),
    	
    	/**
    	 * Email [thorough only].
    	 */
    	EML("44656C69766572792D646174653A"),
    	
    	/**
    	 * Outlook Express.
    	 */
    	DBX("CFAD12FEC5FD746F"),
    	
    	/**
    	 * Outlook (pst).
    	 */
    	PST("2142444E"),
    	
    	/**
    	 * MS Word/Excel.
    	 */
    	XLS_DOC("D0CF11E0"),
    	
    	/**
    	 * MS Access.
    	 */
    	MDB("5374616E64617264204A"),
    	
    	/**
    	 * WordPerfect.
    	 */
    	WPD("FF575043"),
    	
    	/**
    	 * Postscript.
    	 */
    	EPS("252150532D41646F6265"),
    	
    	/**
    	 * Adobe Acrobat.
    	 */
    	PDF("255044462D312E"),
    	
    	/**
    	 * Quicken.
    	 */
    	QDF("AC9EBD8F"),
    	
    	/**
    	 * Windows Password.
    	 */
    	PWL("E3828596"),
    	
    	/**
    	 * ZIP Archive.
    	 */
    	ZIP("504B0304"),
    	
    	/**
    	 * RAR Archive.
    	 */
    	RAR("52617221"),
    	
    	/**
    	 * Wave.
    	 */
    	WAV("57415645"),
    	
    	/**
    	 * AVI.
    	 */
    	AVI("41564920"),
    	
    	/**
    	 * Real Audio.
    	 */
    	RAM("2E7261FD"),
    	
    	/**
    	 * Real Media.
    	 */
    	RM("2E524D46"),
    	
    	/**
    	 * MPEG (mpg).
    	 */
    	MPG("000001BA"),
    	
    	/**
    	 * Quicktime.
    	 */
    	MOV("6D6F6F76"),
    	
    	/**
    	 * Windows Media.
    	 */
    	ASF("3026B2758E66CF11"),
    	
    	/**
    	 * MIDI.
    	 */
    	MID("4D546864");
    	
    	private String value = "";
    	
    	/**
    	 * Constructor.
    	 * 
    	 * @param type 
    	 */
    	private FileType(String value) {
    		this.value = value;
    	}
    
    	public String getValue() {
    		return value;
    	}
    
    	public void setValue(String value) {
    		this.value = value;
    	}
    }
    

      然后是类型判断核心类

    package org.filetype;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    /**
     * 文件类型判断类
     */
    public final class FileTypeJudge {
    	
    	/**
    	 * Constructor
    	 */
    	private FileTypeJudge() {}
    	
    	/**
    	 * 将文件头转换成16进制字符串
    	 * 
    	 * @param 原生byte
    	 * @return 16进制字符串
    	 */
    	private 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] & 0xFF;   
                String hv = Integer.toHexString(v);   
                if (hv.length() < 2) {   
                    stringBuilder.append(0);   
                }   
                stringBuilder.append(hv);   
            }   
            return stringBuilder.toString();   
        }
       
    	/**
    	 * 得到文件头
    	 * 
    	 * @param filePath 文件路径
    	 * @return 文件头
    	 * @throws IOException
    	 */
    	private static String getFileContent(String filePath) throws IOException {
    		
    		byte[] b = new byte[28];
    		
    		InputStream inputStream = null;
    		
    		try {
    			inputStream = new FileInputStream(filePath);
    			inputStream.read(b, 0, 28);
    		} catch (IOException e) {
    			e.printStackTrace();
    			throw e;
    		} finally {
    			if (inputStream != null) {
    				try {
    					inputStream.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    					throw e;
    				}
    			}
    		}
    		return bytesToHexString(b);
    	}
    	
    	/**
    	 * 判断文件类型
    	 * 
    	 * @param filePath 文件路径
    	 * @return 文件类型
    	 */
    	public static FileType getType(String filePath) throws IOException {
    		
    		String fileHead = getFileContent(filePath);
    		
    		if (fileHead == null || fileHead.length() == 0) {
    			return null;
    		}
    		
    		fileHead = fileHead.toUpperCase();
    		
    		FileType[] fileTypes = FileType.values();
    		
    		for (FileType type : fileTypes) {
    			if (fileHead.startsWith(type.getValue())) {
    				return type;
    			}
    		}
    		
    		return null;
    	}
    }
    

      最后是测试类

    package org.filetype;
    
    public class Test {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String args[]) throws Exception {
    		System.out.println(FileTypeJudge.getType("C:\eclipse-jee-helios-win32.zip"));
    	}
    
    }
    

      

  • 相关阅读:
    Quartz使用总结
    quartz基本介绍和使用
    Spring的StringUtils工具类
    JreBel热部署不生效,2019最新解决方法
    解决IDEA下SpringBoot启动没有Run Dashboard并找回
    IDEA十大经典常用插件
    Java8 Comparator 排序方法
    JRebel 激活码 2020
    比较两个java.util.Date 的日期(年月日)是否相同(忽略时、分、秒)的多种方法
    kafka的Lag 计算误区及正确方式
  • 原文地址:https://www.cnblogs.com/koal/p/4394279.html
Copyright © 2020-2023  润新知