估计当大家看到此片文件的标题后,会很疑惑,到底要阐述些什么呢?其实我一开始也疑惑,怎么会碰到这样的问题呀。事情是这样的,公司最早使用的是一个厂商的产品来存储影像,由于维护成本太高,决定新做一个系统进行影像的管理,但是老的影像数据不能丢了呀,就必然要将将老的影像迁移出来,重新存储并存储索引了。但是让人吐血的是,厂商只提供了一个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的前面都有部分是相同,通过这点可以清楚的区分它们。但是我试了下其他类型,其它并不是完全准备,特别是微软的那些文件的类型很难区分,有兴趣的同学可以自己试试咯。。