Java根据文件头获取文件类型

标签: java 文件 文件类型 | 发表时间:2012-12-23 11:44 | 作者:你爸是李刚
出处:http://www.blogjava.net
文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation)。 
     为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式。具体代码如下: 
 
  1. package com.test.day11.io;  
  2. import java.io.FileInputStream;  
  3. import java.io.IOException;  
  4. import java.util.HashMap;  
  5. /** 
  6.  * 获取和判断文件头信息 
  7.  *  
  8.  * @author bigbird 
  9.  *  
  10.  */  
  11. public class FileType {  
  12.       
  13.     //缓存文件头信息-文件头信息  
  14.     public static final HashMap<String, String> mFileTypes = new HashMap<String, String>();  
  15.   
  16.     static {  
  17.         // images  
  18.         mFileTypes.put("FFD8FF", "jpg");  
  19.         mFileTypes.put("89504E47", "png");  
  20.         mFileTypes.put("47494638", "gif");  
  21.         mFileTypes.put("49492A00", "tif");  
  22.         mFileTypes.put("424D", "bmp");  
  23.         //  
  24.         mFileTypes.put("41433130", "dwg"); // CAD  
  25.         mFileTypes.put("38425053", "psd");  
  26.         mFileTypes.put("7B5C727466", "rtf"); // 日记本  
  27.         mFileTypes.put("3C3F786D6C", "xml");  
  28.         mFileTypes.put("68746D6C3E", "html");  
  29.         mFileTypes.put("44656C69766572792D646174653A", "eml"); // 邮件  
  30.         mFileTypes.put("D0CF11E0", "doc");  
  31.         mFileTypes.put("5374616E64617264204A", "mdb");  
  32.         mFileTypes.put("252150532D41646F6265", "ps");  
  33.         mFileTypes.put("255044462D312E", "pdf");  
  34.         mFileTypes.put("504B0304", "docx");  
  35.         mFileTypes.put("52617221", "rar");  
  36.         mFileTypes.put("57415645", "wav");  
  37.         mFileTypes.put("41564920", "avi");  
  38.         mFileTypes.put("2E524D46", "rm");  
  39.         mFileTypes.put("000001BA", "mpg");  
  40.         mFileTypes.put("000001B3", "mpg");  
  41.         mFileTypes.put("6D6F6F76", "mov");  
  42.         mFileTypes.put("3026B2758E66CF11", "asf");  
  43.         mFileTypes.put("4D546864", "mid");  
  44.         mFileTypes.put("1F8B08", "gz");  
  45.         mFileTypes.put("", "");  
  46.         mFileTypes.put("", "");  
  47.     }  
  48.   
  49.     /** 
  50.      * 根据文件路径获取文件头信息 
  51.      *  
  52.      * @param filePath 
  53.      *            文件路径 
  54.      * @return 文件头信息 
  55.      */  
  56.     public static String getFileType(String filePath) {  
  57.         return mFileTypes.get(getFileHeader(filePath));  
  58.     }  
  59.   
  60.     /** 
  61.      * 根据文件路径获取文件头信息 
  62.      *  
  63.      * @param filePath 
  64.      *            文件路径 
  65.      * @return 文件头信息 
  66.      */  
  67.     public static String getFileHeader(String filePath) {  
  68.         FileInputStream is = null;  
  69.         String value = null;  
  70.         try {  
  71.             is = new FileInputStream(filePath);  
  72.             byte[] b = new byte[4];  
  73.             is.read(b, 0, b.length);  
  74.             value = bytesToHexString(b);  
  75.         } catch (Exception e) {  
  76.         } finally {  
  77.             if (null != is) {  
  78.                 try {  
  79.                     is.close();  
  80.                 } catch (IOException e) {  
  81.                 }  
  82.             }  
  83.         }  
  84.         return value;  
  85.     }  
  86.   
  87.     /** 
  88.      * 将要读取文件头信息的文件的byte数组转换成string类型表示 
  89.      *  
  90.      * @param src 
  91.      *            要读取文件头信息的文件的byte数组 
  92.      * @return 文件头信息 
  93.      */  
  94.     private static String bytesToHexString(byte[] src) {  
  95.         StringBuilder builder = new StringBuilder();  
  96.         if (src == null || src.length <= 0) {  
  97.             return null;  
  98.         }  
  99.         String hv;  
  100.         for (int i = 0; i < src.length; i++) {  
  101.             // 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式,并转换为大写  
  102.             hv = Integer.toHexString(src[i] & 0xFF).toUpperCase();  
  103.             if (hv.length() < 2) {  
  104.                 builder.append(0);  
  105.             }  
  106.             builder.append(hv);  
  107.         }  
  108.         return builder.toString();  
  109.     }  
  110.   
  111.     public static void main(String[] args) throws Exception {  
  112.         final String fileType = getFileType("E:/读书笔记/Java编程思想读书笔记.docx");  
  113.         System.out.println(fileType);  
  114.     }  
  115. }  


本文链接

相关 [java 文件 文件类型] 推荐:

Java根据文件头获取文件类型

- - BlogJava_首页
文件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分. 头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation).      为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式.

java,根据头文件判断文件类型

- - Java - 编程语言 - ITeye博客
web判断文件的格式的时候,我们一般都是通过扩展名来判断,这个有点不太靠谱和安全. 下面是利用头文件来判断的代码:. * 根据文件流读取图片文件真实类型.  网上搜索了一些头文件的格式,但是强调一下,txt文件没有固定的头名,需要另外考虑,供参考:. JPEG (jpg),文件头:FFD8FF  .

Evernote 取消针对免费账号的文件类型限制

- Ruby - FeedzShare
来自: 36氪 - FeedzShare  . 发布时间:2011年09月08日,  已有 2 人推荐. 来自Evernote 的消息,他们刚刚取消了针对免费账号的文件类型限制,免费用户也将可以为任何笔记添加任何类型的文件附件. 不过对于笔记的大小限制及每月流量限制没有改变,免费用户每个笔记最大只能是25MB,每月流量最多60MB.

Java的 class文件结构

- - Java - 编程语言 - ITeye博客
Java-class文件结构.        我们都知道我们现在写的源代码计算机是不认识的,我们需要根据指定的编译器进行编译-连接-执行,这样才是我们想要的结果,所以计算机只能认识0或者1 ,那么如何与操作系统或者机器指令无关的程序能执行,那么在操作系统以及机器指令之上的那就是虚拟机了,这样我们编写的代码不再是最终形成二进制本地指令代码,而是一种在操作系统和机器指令之上的虚拟机规定的文件格式.

Java写xml文件的编码问题

- - CSDN博客推荐文章
最近项目中需要生成xml格式的配置文件,用的是 javax.xml.transform.Transformer 类中提供的transform方法,在本地执行没问题,但是一旦把工程部署到Tomcat下运行,就会出现中文乱码的现象,纠结了许久,在大神的帮助下终于解决了. 有篇文章其实已经讲的很清楚了,链接如下:.

JAVA 动态(手动)加载jar文件

- - CSDN博客编程语言推荐文章
//filePath 是jar的绝对路径. //里面是一个url的数组,可以同时加载多个. //根据类名加载指定类,例:. //通过反射调用类中的方法,例如调用addFile方法,有1个String参数和一个int参数:. 如果有返回值,则直接返回需要的值,例:. 作者:kingboy123000 发表于2013-10-23 16:12:30 原文链接.

使用Java处理大文件

- - ImportNew
我最近要处理一套存储历史实时数据的大文件 fx market data,我很快便意识到,使用传统的InputStream不能够将它们读取到内存,因为每一个文件都超过了4G. 甚至编辑器都不能够打开这些文件. 在这种特殊情况下,我可以写一个简单的bash脚本将这些文件分成更小的文件块,然后再读取它.

Java读取远程主机文件

- - ITeye博客
//Java利用第三方jar包(ganymed-ssh2-build210.jar)读取远程主机文件. String idxMasterPath = useHome+"ADR/cb/data/master/";   //主侧IDX文件路径. String idxSlavePath = useHome+"ADR/cb/data/slave/";     //备侧文件路径.

分析一个Java Class文件

- - CSDN博客推荐文章
Java源码文件TestClass.java:. 展示这个Class文件的16进制内容:. 00 00 00 34 : 版本号是1.8.0;. 00 16: 说明常量池有21个常量,1-21, index留做他用;接下来就是分别这21个常量的描述:. 07/00 02 :CONSTANT_Class_info 常量,类名索引是该常量池的第2项;.