打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
(原)用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.  */  
  6. public enum FileType {  
  7.       
  8.     /** 
  9.      * JEPG. 
  10.      */  
  11.     JPEG("FFD8FF"),  
  12.       
  13.     /** 
  14.      * PNG. 
  15.      */  
  16.     PNG("89504E47"),  
  17.       
  18.     /** 
  19.      * GIF. 
  20.      */  
  21.     GIF("47494638"),  
  22.       
  23.     /** 
  24.      * TIFF. 
  25.      */  
  26.     TIFF("49492A00"),  
  27.       
  28.     /** 
  29.      * Windows Bitmap. 
  30.      */  
  31.     BMP("424D"),  
  32.       
  33.     /** 
  34.      * CAD. 
  35.      */  
  36.     DWG("41433130"),  
  37.       
  38.     /** 
  39.      * Adobe Photoshop. 
  40.      */  
  41.     PSD("38425053"),  
  42.       
  43.     /** 
  44.      * Rich Text Format. 
  45.      */  
  46.     RTF("7B5C727466"),  
  47.       
  48.     /** 
  49.      * XML. 
  50.      */  
  51.     XML("3C3F786D6C"),  
  52.       
  53.     /** 
  54.      * HTML. 
  55.      */  
  56.     HTML("68746D6C3E"),  
  57.       
  58.     /** 
  59.      * Email [thorough only]. 
  60.      */  
  61.     EML("44656C69766572792D646174653A"),  
  62.       
  63.     /** 
  64.      * Outlook Express. 
  65.      */  
  66.     DBX("CFAD12FEC5FD746F"),  
  67.       
  68.     /** 
  69.      * Outlook (pst). 
  70.      */  
  71.     PST("2142444E"),  
  72.       
  73.     /** 
  74.      * MS Word/Excel. 
  75.      */  
  76.     XLS_DOC("D0CF11E0"),  
  77.       
  78.     /** 
  79.      * MS Access. 
  80.      */  
  81.     MDB("5374616E64617264204A"),  
  82.       
  83.     /** 
  84.      * WordPerfect. 
  85.      */  
  86.     WPD("FF575043"),  
  87.       
  88.     /** 
  89.      * Postscript. 
  90.      */  
  91.     EPS("252150532D41646F6265"),  
  92.       
  93.     /** 
  94.      * Adobe Acrobat. 
  95.      */  
  96.     PDF("255044462D312E"),  
  97.       
  98.     /** 
  99.      * Quicken. 
  100.      */  
  101.     QDF("AC9EBD8F"),  
  102.       
  103.     /** 
  104.      * Windows Password. 
  105.      */  
  106.     PWL("E3828596"),  
  107.       
  108.     /** 
  109.      * ZIP Archive. 
  110.      */  
  111.     ZIP("504B0304"),  
  112.       
  113.     /** 
  114.      * RAR Archive. 
  115.      */  
  116.     RAR("52617221"),  
  117.       
  118.     /** 
  119.      * Wave. 
  120.      */  
  121.     WAV("57415645"),  
  122.       
  123.     /** 
  124.      * AVI. 
  125.      */  
  126.     AVI("41564920"),  
  127.       
  128.     /** 
  129.      * Real Audio. 
  130.      */  
  131.     RAM("2E7261FD"),  
  132.       
  133.     /** 
  134.      * Real Media. 
  135.      */  
  136.     RM("2E524D46"),  
  137.       
  138.     /** 
  139.      * MPEG (mpg). 
  140.      */  
  141.     MPG("000001BA"),  
  142.       
  143.     /** 
  144.      * Quicktime. 
  145.      */  
  146.     MOV("6D6F6F76"),  
  147.       
  148.     /** 
  149.      * Windows Media. 
  150.      */  
  151.     ASF("3026B2758E66CF11"),  
  152.       
  153.     /** 
  154.      * MIDI. 
  155.      */  
  156.     MID("4D546864");  
  157.       
  158.     private String value = "";  
  159.       
  160.     /** 
  161.      * Constructor. 
  162.      *  
  163.      * @param type  
  164.      */  
  165.     private FileType(String value) {  
  166.         this.value = value;  
  167.     }  
  168.   
  169.     public String getValue() {  
  170.         return value;  
  171.     }  
  172.   
  173.     public void setValue(String value) {  
  174.         this.value = value;  
  175.     }  
  176. }  
 
然后是类型判断核心类
Java代码  
  1. package org.filetype;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6.   
  7. /** 
  8.  * 文件类型判断类 
  9.  */  
  10. public final class FileTypeJudge {  
  11.       
  12.     /** 
  13.      * Constructor 
  14.      */  
  15.     private FileTypeJudge() {}  
  16.       
  17.     /** 
  18.      * 将文件头转换成16进制字符串 
  19.      *  
  20.      * @param 原生byte 
  21.      * @return 16进制字符串 
  22.      */  
  23.     private static String bytesToHexString(byte[] src){  
  24.           
  25.         StringBuilder stringBuilder = new StringBuilder();     
  26.         if (src == null || src.length <= 0) {     
  27.             return null;     
  28.         }     
  29.         for (int i = 0; i < src.length; i++) {     
  30.             int v = src[i] & 0xFF;     
  31.             String hv = Integer.toHexString(v);     
  32.             if (hv.length() < 2) {     
  33.                 stringBuilder.append(0);     
  34.             }     
  35.             stringBuilder.append(hv);     
  36.         }     
  37.         return stringBuilder.toString();     
  38.     }  
  39.      
  40.     /** 
  41.      * 得到文件头 
  42.      *  
  43.      * @param filePath 文件路径 
  44.      * @return 文件头 
  45.      * @throws IOException 
  46.      */  
  47.     private static String getFileContent(String filePath) throws IOException {  
  48.           
  49.         byte[] b = new byte[28];  
  50.           
  51.         InputStream inputStream = null;  
  52.           
  53.         try {  
  54.             inputStream = new FileInputStream(filePath);  
  55.             inputStream.read(b, 0, 28);  
  56.         } catch (IOException e) {  
  57.             e.printStackTrace();  
  58.             throw e;  
  59.         } finally {  
  60.             if (inputStream != null) {  
  61.                 try {  
  62.                     inputStream.close();  
  63.                 } catch (IOException e) {  
  64.                     e.printStackTrace();  
  65.                     throw e;  
  66.                 }  
  67.             }  
  68.         }  
  69.         return bytesToHexString(b);  
  70.     }  
  71.       
  72.     /** 
  73.      * 判断文件类型 
  74.      *  
  75.      * @param filePath 文件路径 
  76.      * @return 文件类型 
  77.      */  
  78.     public static FileType getType(String filePath) throws IOException {  
  79.           
  80.         String fileHead = getFileContent(filePath);  
  81.           
  82.         if (fileHead == null || fileHead.length() == 0) {  
  83.             return null;  
  84.         }  
  85.           
  86.         fileHead = fileHead.toUpperCase();  
  87.           
  88.         FileType[] fileTypes = FileType.values();  
  89.           
  90.         for (FileType type : fileTypes) {  
  91.             if (fileHead.startsWith(type.getValue())) {  
  92.                 return type;  
  93.             }  
  94.         }  
  95.           
  96.         return null;  
  97.     }  
  98. }  
最后是测试类
Java代码  
  1. package org.filetype;  
  2.   
  3. public class Test {  
  4.   
  5.     /** 
  6.      * @param args 
  7.      */  
  8.     public static void main(String args[]) throws Exception {  
  9.         System.out.println(FileTypeJudge.getType("C:\\eclipse-jee-helios-win32.zip"));  
  10.     }  
  11.   
  12. }  
 
执行测试类,console上显示zip。。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
java io详解
Java基础输入输出
java 从网络Url中下载文件
Properties属性文件
java IO操作 按照规律合并两个txt文件
基于SMB/JCIFS协议的共享文件上传和下载
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服