通过文件内容判定文件的类型

     估计当大家看到此片文件的标题后,会很疑惑,到底要阐述些什么呢?其实我一开始也疑惑,怎么会碰到这样的问题呀。事情是这样的,公司最早使用的是一个厂商的产品来存储影像,由于维护成本太高,决定新做一个系统进行影像的管理,但是老的影像数据不能丢了呀,就必然要将将老的影像迁移出来,重新存储并存储索引了。但是让人吐血的是,厂商只提供了一个socket接口,并且返回的竟然只有文件的二进制。纠结呀,我取到应该存成什么类型呀。还好此批数据基本上都是一些扫描件,而也就限定的其格式只有tif和jpg。但是如何通过二进制来将而至区分开呢?通过windows很纠结,你改成什么扩展名,它就认为是什么类型,根本无计可循。但是linux就不一样,通过file命令可以清楚的知道实际类型。从这一点看,我感觉通过文件的二进制应该是可以区别文件的类型的。

     

      和大家一样,遇到问题google、baidu,翻呀翻,终于通过一篇文档启发了我。是否可以通过二进制前几个字节转成16进制看看,是否会有所规律。没想到一试之下迎刃而解。。

 

package mimetype;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class MimeType {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		byte[] b=new byte[15];
		InputStream in=new FileInputStream(new File("D:\\Test\\2.jpg"));
		in.read(b);
		StringBuffer sb=new StringBuffer();
		for (int i = 0; i < b.length; i++) {
			String str=Integer.toHexString(b[i]);
			sb.append(str);
		}

		if(sb.toString().toUpperCase().startsWith("FFFFFFFFFFFFFFD8")){
			System.out.println("is jpg");
		}
		
		if(sb.toString().toUpperCase().startsWith("47494638")){
			System.out.println("is tif");
		}
	}

}

 

可以看到jpg和tif的前面都有部分是相同,通过这点可以清楚的区分它们。但是我试了下其他类型,其它并不是完全准备,特别是微软的那些文件的类型很难区分,有兴趣的同学可以自己试试咯。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值