美国上市公司,专注Java培训21年

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


件头是位于文件开头的一段承担一定任务的数据,一般都在开头的部分。头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation)。

为了解决在用户上传文件的时候在服务器端判断文件类型的问题,故用获取文件头的方式,直接读取文件的前几个字节,来判断上传文件是否符合格式。具体代码如下:

Java代码 :

package com.test.day11.io;

import java.io.FileInputStream;

import java.io.IOException;

import java.util.HashMap;

/**

* 获取和判断文件头信息

*

* @author bigbird

*

*/

public class FileType {

//缓存文件头信息-文件头信息

public static final HashMap mFileTypes = new HashMap();

static {

// images

mFileTypes.put("FFD8FF", "jpg");

mFileTypes.put("89504E47", "png");

mFileTypes.put("47494638", "gif");

mFileTypes.put("49492A00", "tif");

mFileTypes.put("424D", "bmp");

//

mFileTypes.put("41433130", "dwg"); // CAD

mFileTypes.put("38425053", "psd");

mFileTypes.put("7B5C727466", "rtf"); // 日记本

mFileTypes.put("3C3F786D6C", "xml");

mFileTypes.put("68746D6C3E", "html");

mFileTypes.put("44656C69766572792D646174653A", "eml"); // 邮件

mFileTypes.put("D0CF11E0", "doc");

mFileTypes.put("5374616E64617264204A", "mdb");

mFileTypes.put("252150532D41646F6265", "ps");

mFileTypes.put("255044462D312E", "pdf");

mFileTypes.put("504B0304", "docx");

mFileTypes.put("52617221", "rar");

mFileTypes.put("57415645", "wav");

mFileTypes.put("41564920", "avi");

mFileTypes.put("2E524D46", "rm");

mFileTypes.put("000001BA", "mpg");

mFileTypes.put("000001B3", "mpg");

mFileTypes.put("6D6F6F76", "mov");

mFileTypes.put("3026B2758E66CF11", "asf");

mFileTypes.put("4D546864", "mid");

mFileTypes.put("1F8B08", "gz");

mFileTypes.put("", "");

mFileTypes.put("", "");

}

/**

* 根据文件路径获取文件头信息

*

* @param filePath

* 文件路径

* @return 文件头信息

*/

public static String getFileType(String filePath) {

return mFileTypes.get(getFileHeader(filePath));

}

/**

* 根据文件路径获取文件头信息

*

* @param filePath

* 文件路径

* @return 文件头信息

*/

public static String getFileHeader(String filePath) {

FileInputStream is = null;

String value = null;

try {

is = new FileInputStream(filePath);

byte[] b = new byte[4];

is.read(b, 0, b.length);

value = bytesToHexString(b);

} catch (Exception e) {

} finally {

if (null != is) {

try {

is.close();

} catch (IOException e) {

}

}

}

return value;

}

/**

* 将要读取文件头信息的文件的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();

}

public static void main(String[] args) throws Exception {

final String fileType = getFileType("E:/读书笔记/Java编程思想读书笔记。docx");

System.out.println(fileType);

}

}


【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!

Java开发高端课程免费试学

大咖讲师+项目实战全面提升你的职场竞争力

  • 海量实战教程
  • 1V1答疑解惑
  • 行业动态分析
  • 大神学习路径图

相关推荐

更多
  • java中的模型与渲染器
  • log4j详细配置必看
    log4j详细配置必看
    很多屌丝都觉得log4j不好用,因为它不输出到IDE的控制台,哈哈,其实都是配置惹的祸,下面看我怎么一步步配置到控制台的, 详情>>

    2015-01-06

  • Java创建线程的两个方法
    Java创建线程的两个方法
    Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。 详情>>

    2015-01-07

  • Java中的模式--单态
  • Java开班时间

    收起