zoukankan      html  css  js  c++  java
  • 用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"));
    	}
    
    }
    

      

  • 相关阅读:
    Java实现 计蒜客 拯救行动
    Java实现 计蒜客 拯救行动
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 174 地下城游戏
    Java实现 LeetCode 173 二叉搜索树迭代器
    Java实现 LeetCode 173 二叉搜索树迭代器
    Visual Studio的SDK配置
    怎样使用CMenu类
    mfc menu用法一
  • 原文地址:https://www.cnblogs.com/koal/p/4394279.html
Copyright © 2011-2022 走看看