Java 读取文件 文件头字节码信息,判断文件类型

不同文件对应的文件头信息:
(“FFD8FFE0”, “jpg”);
(“89504E47”, “png”);
(“47494638”, “gif”);
(“49492A00”, “tif”);
(“424D”, “bmp”); //
(“41433130”, “dwg”); // CAD
(“38425053”, “psd”);
(“7B5C727466”, “rtf”); // 日记本
(“3C3F786D6C”, “xml”);
(“68746D6C3E”, “html”);
(“44656C69766572792D646174653A”, “eml”); // 邮件
(“D0CF11E0”, “doc”); // word or xls
(“5374616E64617264204A”, “mdb”);
(“252150532D41646F6265”, “ps”);
(“255044462D312E”, “pdf”);
(“504B0304”, “docx”); //word or xlsx
(“52617221”, “rar”);
(“57415645”, “wav”);
(“41564920”, “avi”);
(“2E524D46”, “rm”);
(“000001BA”, “mpg”);
(“000001B3”, “mpg”);
(“6D6F6F76”, “mov”);
(“3026B2758E66CF11”, “asf”);
(“4D546864”, “mid”);
(“1F8B08”, “gz”);
(“4D5A9000”, “exe/dll”);
(“75736167”, “txt”);

java 代码:
		import java.io.ByteArrayOutputStream;
		import java.io.File;
		import java.io.FileInputStream;
		import java.io.FileNotFoundException;
		import java.io.IOException;
		import java.util.Arrays;
 /**   
 * @ClassName:  GetFileType   
 */
public class GetFileType {
	/** 
     * 获得指定文件的byte数组 
     */  
    public static byte[] getBytes(String filePath){  
        byte[] buffer = null;  
        try {  
            File file = new File(filePath);  
            FileInputStream fis = new FileInputStream(file);  
            ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);  
            byte[] b = new byte[(int)file.length()];  
            int n;  
            while ((n = fis.read(b)) != -1) {  
                bos.write(b, 0, n);  
            }  
            fis.close();  
            bos.close();  
            buffer = bos.toByteArray();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return buffer;  
    }
    
    /**
     * 将要读取文件头信息的文件的byte数组转换成string类型表示
     * @param src	要读取文件头信息的文件的byte数组
     * @return 文件头信息
     */
    private static String bytesToHexString(byte[] src) {
        StringBuilder builder = new StringBuilder();
        if (src == null || src.length <= 0) {
            return null;
        }
        String hv;
        for (int i = 0; i < src.length; i++) {
            // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写
            hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();
            if (hv.length() < 2) {
                builder.append(0);
            }
            builder.append(hv);
        }

        return builder.toString();
    }
    
    /**
     * @return boolean
     */
    public static boolean fileTypes(byte[] bytes){
        //文件的文件头信息
        byte[] b = new byte[4];
        
        for (int i=0; i<b.length; i++) {
            b[i] = bytes[i];
        }
        System.out.println(Arrays.toString(b));
        //将文件的文件头字节码转换成字符串
        String filetype = bytesToHexString(b);
        System.out.println(filetype);
        
        if("FFD8FFE0".equals(filetype)){
        	
            return true;
        }
        
        return false;
    }

    public static void main(String[] args) throws Exception {
        byte[] bytes = GetFileType.getBytes("C:\\***\\2.jpg");
        System.out.println(Arrays.toString(bytes));
        System.out.println(GetFileType.fileTypes(bytes));
    }

文章转载自:https://www.cnblogs.com/onop/p/10219994.html

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以通过读取文件字节数组来判断文件的格式。每种文件格式都有一定的文件,即文件的前几个字节是特定的标识符或特征码,通过判断文件头部字节可以确定文件的格式。 具体的判断方法如下: 1. 使用Java文件读取流来读取文件字节数组,可以使用FileInputStream或者RandomAccessFile。 2. 读取文件的前几个字节,这个数量根据不同的文件格式而不同。一般来说,至少需要读取文件的前几个字节判断文件的格式。 3. 根据读取到的字节数组,进行特征码的判断。每种文件格式都有不同的特征码,可以通过比较读取到的字节数组和特征码来判断文件的格式。 4. 对比判断的结果,如果字节数组与某种文件格式的特征码相符,则可以确定文件的格式。 5. 如果需要判断多种文件格式,则可以逐个对比每种文件格式的特征码,直到找到匹配的文件格式或者没有匹配的文件格式。 需要注意的是,判断文件格式并不是100%准确的,因为有些文件格式的特征码可能相似或者有特殊情况。此外,一些文件格式也可以通过文件的后缀名来判断,但后缀名并不是绝对可信的,有可能被修改或者不准确。 总的来说,通过读取文件字节数组来判断文件的格式是一种比较常见和简单的方法,但需要对不同的文件格式有一定的了解,并且需要根据实际情况进行判断和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值