(原)用java流方式判断文件类型

      (原)用java流方式判断文件类型已关闭评论

没想到4月份我的一个回帖已经被人转载。。。在我这个正版还没出来之前。。。。

 

原帖地址

http://topic.csdn.net/u/20100430/11/1e14634d-0045-47f8-9e1b-f8fd52ba1597.html?seed=881844262&r=65101569#r_65101569

 

其实,回帖中仍然有不全面的地方(txt文件并没有文件头,所以无法用此法判断)

 

这个方法只能在有限的范围内有效。并不是万金油

 

比如

图片类型判断,音频文件格式判断,视频文件格式判断等这种肯定是2进制且专业性很强的文件类型判断。

 

下面给出完整版代码

首先是文件类型枚取

 

 

 

Java代码  收藏代码
  1. package org.filetype;
  2. /**
  3.  * 文件类型枚取
  4.  */
  5. public enum FileType {
  6.     /**
  7.      * JEPG.
  8.      */
  9.     JPEG(“FFD8FF”),
  10.     /**
  11.      * PNG.
  12.      */
  13.     PNG(“89504E47”),
  14.     /**
  15.      * GIF.
  16.      */
  17.     GIF(“47494638”),
  18.     /**
  19.      * TIFF.
  20.      */
  21.     TIFF(“49492A00”),
  22.     /**
  23.      * Windows Bitmap.
  24.      */
  25.     BMP(“424D”),
  26.     /**
  27.      * CAD.
  28.      */
  29.     DWG(“41433130”),
  30.     /**
  31.      * Adobe Photoshop.
  32.      */
  33.     PSD(“38425053”),
  34.     /**
  35.      * Rich Text Format.
  36.      */
  37.     RTF(“7B5C727466”),
  38.     /**
  39.      * XML.
  40.      */
  41.     XML(“3C3F786D6C”),
  42.     /**
  43.      * HTML.
  44.      */
  45.     HTML(“68746D6C3E”),
  46.     /**
  47.      * Email [thorough only].
  48.      */
  49.     EML(“44656C69766572792D646174653A”),
  50.     /**
  51.      * Outlook Express.
  52.      */
  53.     DBX(“CFAD12FEC5FD746F”),
  54.     /**
  55.      * Outlook (pst).
  56.      */
  57.     PST(“2142444E”),
  58.     /**
  59.      * MS Word/Excel.
  60.      */
  61.     XLS_DOC(“D0CF11E0”),
  62.     /**
  63.      * MS Access.
  64.      */
  65.     MDB(“5374616E64617264204A”),
  66.     /**
  67.      * WordPerfect.
  68.      */
  69.     WPD(“FF575043”),
  70.     /**
  71.      * Postscript.
  72.      */
  73.     EPS(“252150532D41646F6265”),
  74.     /**
  75.      * Adobe Acrobat.
  76.      */
  77.     PDF(“255044462D312E”),
  78.     /**
  79.      * Quicken.
  80.      */
  81.     QDF(“AC9EBD8F”),
  82.     /**
  83.      * Windows Password.
  84.      */
  85.     PWL(“E3828596”),
  86.     /**
  87.      * ZIP Archive.
  88.      */
  89.     ZIP(“504B0304”),
  90.     /**
  91.      * RAR Archive.
  92.      */
  93.     RAR(“52617221”),
  94.     /**
  95.      * Wave.
  96.      */
  97.     WAV(“57415645”),
  98.     /**
  99.      * AVI.
  100.      */
  101.     AVI(“41564920”),
  102.     /**
  103.      * Real Audio.
  104.      */
  105.     RAM(“2E7261FD”),
  106.     /**
  107.      * Real Media.
  108.      */
  109.     RM(“2E524D46”),
  110.     /**
  111.      * MPEG (mpg).
  112.      */
  113.     MPG(“000001BA”),
  114.     /**
  115.      * Quicktime.
  116.      */
  117.     MOV(“6D6F6F76”),
  118.     /**
  119.      * Windows Media.
  120.      */
  121.     ASF(“3026B2758E66CF11”),
  122.     /**
  123.      * MIDI.
  124.      */
  125.     MID(“4D546864”);
  126.     private String value = “”;
  127.     /**
  128.      * Constructor.
  129.      * 
  130.      * @param type 
  131.      */
  132.     private FileType(String value) {
  133.         this.value = value;
  134.     }
  135.     public String getValue() {
  136.         return value;
  137.     }
  138.     public void setValue(String value) {
  139.         this.value = value;
  140.     }
  141. }

 

然后是类型判断核心类
Java代码  收藏代码
  1. package org.filetype;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. /**
  6.  * 文件类型判断类
  7.  */
  8. public final class FileTypeJudge {
  9.     /**
  10.      * Constructor
  11.      */
  12.     private FileTypeJudge() {}
  13.     /**
  14.      * 将文件头转换成16进制字符串
  15.      * 
  16.      * @param 原生byte
  17.      * @return 16进制字符串
  18.      */
  19.     private static String bytesToHexString(byte[] src){
  20.         StringBuilder stringBuilder = new StringBuilder();
  21.         if (src == null || src.length <= 0) {
  22.             return null;
  23.         }
  24.         for (int i = 0; i < src.length; i++) {
  25.             int v = src[i] & 0xFF;
  26.             String hv = Integer.toHexString(v);
  27.             if (hv.length() < 2) {
  28.                 stringBuilder.append(0);
  29.             }
  30.             stringBuilder.append(hv);
  31.         }
  32.         return stringBuilder.toString();
  33.     }
  34.     /**
  35.      * 得到文件头
  36.      * 
  37.      * @param filePath 文件路径
  38.      * @return 文件头
  39.      * @throws IOException
  40.      */
  41.     private static String getFileContent(String filePath) throws IOException {
  42.         byte[] b = new byte[28];
  43.         InputStream inputStream = null;
  44.         try {
  45.             inputStream = new FileInputStream(filePath);
  46.             inputStream.read(b, 028);
  47.         } catch (IOException e) {
  48.             e.printStackTrace();
  49.             throw e;
  50.         } finally {
  51.             if (inputStream != null) {
  52.                 try {
  53.                     inputStream.close();
  54.                 } catch (IOException e) {
  55.                     e.printStackTrace();
  56.                     throw e;
  57.                 }
  58.             }
  59.         }
  60.         return bytesToHexString(b);
  61.     }
  62.     /**
  63.      * 判断文件类型
  64.      * 
  65.      * @param filePath 文件路径
  66.      * @return 文件类型
  67.      */
  68.     public static FileType getType(String filePath) throws IOException {
  69.         String fileHead = getFileContent(filePath);
  70.         if (fileHead == null || fileHead.length() == 0) {
  71.             return null;
  72.         }
  73.         fileHead = fileHead.toUpperCase();
  74.         FileType[] fileTypes = FileType.values();
  75.         for (FileType type : fileTypes) {
  76.             if (fileHead.startsWith(type.getValue())) {
  77.                 return type;
  78.             }
  79.         }
  80.         return null;
  81.     }
  82. }
最后是测试类
Java代码  收藏代码
  1. package org.filetype;
  2. public class Test {
  3.     /**
  4.      * @param args
  5.      */
  6.     public static void main(String args[]) throws Exception {
  7.         System.out.println(FileTypeJudge.getType(“C:\\eclipse-jee-helios-win32.zip”));
  8.     }
  9. }
执行测试类,console上显示zip。。