没想到4月份我的一个回帖已经被人转载。。。在我这个正版还没出来之前。。。。
原帖地址
http://topic.csdn.net/u/20100430/11/1e14634d-0045-47f8-9e1b-f8fd52ba1597.html?seed=881844262&r=65101569#r_65101569
其实,回帖中仍然有不全面的地方(txt文件并没有文件头,所以无法用此法判断)
这个方法只能在有限的范围内有效。并不是万金油
比如
图片类型判断,音频文件格式判断,视频文件格式判断等这种肯定是2进制且专业性很强的文件类型判断。
下面给出完整版代码
首先是文件类型枚取
- package org.filetype;
-
- /**
- * 文件类型枚取
- */
- public enum FileType {
-
- /**
- * JEPG.
- */
- JPEG("FFD8FF"),
-
- /**
- * PNG.
- */
- PNG("89504E47"),
-
- /**
- * GIF.
- */
- GIF("47494638"),
-
- /**
- * TIFF.
- */
- TIFF("49492A00"),
-
- /**
- * Windows Bitmap.
- */
- BMP("424D"),
-
- /**
- * CAD.
- */
- DWG("41433130"),
-
- /**
- * Adobe Photoshop.
- */
- PSD("38425053"),
-
- /**
- * Rich Text Format.
- */
- RTF("7B5C727466"),
-
- /**
- * XML.
- */
- XML("3C3F786D6C"),
-
- /**
- * HTML.
- */
- HTML("68746D6C3E"),
-
- /**
- * Email [thorough only].
- */
- EML("44656C69766572792D646174653A"),
-
- /**
- * Outlook Express.
- */
- DBX("CFAD12FEC5FD746F"),
-
- /**
- * Outlook (pst).
- */
- PST("2142444E"),
-
- /**
- * MS Word/Excel.
- */
- XLS_DOC("D0CF11E0"),
-
- /**
- * MS Access.
- */
- MDB("5374616E64617264204A"),
-
- /**
- * WordPerfect.
- */
- WPD("FF575043"),
-
- /**
- * Postscript.
- */
- EPS("252150532D41646F6265"),
-
- /**
- * Adobe Acrobat.
- */
- PDF("255044462D312E"),
-
- /**
- * Quicken.
- */
- QDF("AC9EBD8F"),
-
- /**
- * Windows Password.
- */
- PWL("E3828596"),
-
- /**
- * ZIP Archive.
- */
- ZIP("504B0304"),
-
- /**
- * RAR Archive.
- */
- RAR("52617221"),
-
- /**
- * Wave.
- */
- WAV("57415645"),
-
- /**
- * AVI.
- */
- AVI("41564920"),
-
- /**
- * Real Audio.
- */
- RAM("2E7261FD"),
-
- /**
- * Real Media.
- */
- RM("2E524D46"),
-
- /**
- * MPEG (mpg).
- */
- MPG("000001BA"),
-
- /**
- * Quicktime.
- */
- MOV("6D6F6F76"),
-
- /**
- * Windows Media.
- */
- ASF("3026B2758E66CF11"),
-
- /**
- * MIDI.
- */
- MID("4D546864");
-
- private String value = "";
-
- /**
- * Constructor.
- *
- * @param type
- */
- private FileType(String value) {
- this.value = value;
- }
-
- public String getValue() {
- return value;
- }
-
- public void setValue(String value) {
- this.value = value;
- }
- }
然后是类型判断核心类
- package org.filetype;
-
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.io.InputStream;
-
- /**
- * 文件类型判断类
- */
- public final class FileTypeJudge {
-
- /**
- * Constructor
- */
- private FileTypeJudge() {}
-
- /**
- * 将文件头转换成16进制字符串
- *
- * @param 原生byte
- * @return 16进制字符串
- */
- private static String bytesToHexString(byte[] src){
-
- StringBuilder stringBuilder = new StringBuilder();
- if (src == null || src.length <= 0) {
- return null;
- }
- for (int i = 0; i < src.length; i++) {
- int v = src[i] & 0xFF;
- String hv = Integer.toHexString(v);
- if (hv.length() < 2) {
- stringBuilder.append(0);
- }
- stringBuilder.append(hv);
- }
- return stringBuilder.toString();
- }
-
- /**
- * 得到文件头
- *
- * @param filePath 文件路径
- * @return 文件头
- * @throws IOException
- */
- private static String getFileContent(String filePath) throws IOException {
-
- byte[] b = new byte[28];
-
- InputStream inputStream = null;
-
- try {
- inputStream = new FileInputStream(filePath);
- inputStream.read(b, 0, 28);
- } catch (IOException e) {
- e.printStackTrace();
- throw e;
- } finally {
- if (inputStream != null) {
- try {
- inputStream.close();
- } catch (IOException e) {
- e.printStackTrace();
- throw e;
- }
- }
- }
- return bytesToHexString(b);
- }
-
- /**
- * 判断文件类型
- *
- * @param filePath 文件路径
- * @return 文件类型
- */
- public static FileType getType(String filePath) throws IOException {
-
- String fileHead = getFileContent(filePath);
-
- if (fileHead == null || fileHead.length() == 0) {
- return null;
- }
-
- fileHead = fileHead.toUpperCase();
-
- FileType[] fileTypes = FileType.values();
-
- for (FileType type : fileTypes) {
- if (fileHead.startsWith(type.getValue())) {
- return type;
- }
- }
-
- return null;
- }
- }
最后是测试类
- package org.filetype;
-
- public class Test {
-
- /**
- * @param args
- */
- public static void main(String args[]) throws Exception {
- System.out.println(FileTypeJudge.getType("C:\\eclipse-jee-helios-win32.zip"));
- }
-
- }
执行测试类,console上显示zip。。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。