[Java]根据文件取得Mime Type的各种方法

来源:互联网 发布:windows xp系统重装 编辑:程序博客网 时间:2024/05/21 17:52

1、mime-util:

      该工具可以通过 检测文件扩展名,或者检测magic header 两种技术方式来实现mime类型的检测。

      比较可靠,而且轻量级、只依赖于slf4j一个包  。2010年后就没有更新了。

      POM

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <dependency>  
  2.     <groupId>eu.medsea.mimeutil</groupId>  
  3.     <artifactId>mime-util</artifactId>  
  4.     <version>2.1.3</version>  
  5. </dependency>  


    示例代码:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. import eu.medsea.mimeutil.MimeUtil;    
  2. public class Main {    
  3.     public static void main(String[] args) {    
  4.         MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");    
  5.         File f = new File ("c:/temp/mime/test.doc");    
  6.         Collection<?> mimeTypes = MimeUtil.getMimeTypes(f);    
  7.         System.out.println(mimeTypes);    
  8.         //  output : application/msword    
  9.     }    
  10. }    

2、JMimeMagic 
通过检测文件后缀名去查找文件类型显然不是一个健壮的方法。
JMimeMagic是一个通过检查magic headers来判断文件或者流的mime 类型的java工具包 。
目前还在持续更新当中、推荐使用。
POM
[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <dependency>  
  2.     <groupId>net.sf.jmimemagic</groupId>  
  3.     <artifactId>jmimemagic</artifactId>  
  4.     <version>0.1.4</version>  
  5. </dependency>  
示例代码
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. Magic parser = new Magic() ;    
  2. // getMagicMatch accepts Files or byte[],    
  3. // which is nice if you want to test streams    
  4. MagicMatch match = parser.getMagicMatch(new File("gumby.gif"));    
  5. System.out.println(match.getMimeType()) ;    

3、java.net.URL 
与上面所说的匹配后缀名类似。后缀名和mime-type的映射关系被定义在[jre_home]\lib\content-types.properties
该组件只根据文件扩展名判断mime-type。不是很可靠。

示例代码(推荐)
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. import java.net.FileNameMap;    
  2. import java.net.URLConnection;    
  3.     
  4. public class FileUtils {    
  5.     
  6.   public static String getMimeType(String fileUrl)    
  7.       throws java.io.IOException    
  8.     {    
  9.       FileNameMap fileNameMap = URLConnection.getFileNameMap();    
  10.       String type = fileNameMap.getContentTypeFor(fileUrl);    
  11.     
  12.       return type;    
  13.     }    
  14.     
  15.     public static void main(String args[]) throws Exception {    
  16.       System.out.println(FileUtils.getMimeType("file://c:/temp/test.TXT"));    
  17.       // output :  text/plain    
  18.     }    
  19.   }   
示例代码(不推荐:这种方式也是通过扩展名判断mime type的、而且速度很慢)
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. import java.net.*;    
  2.     
  3. public class FileUtils{    
  4.   public static String getMimeType(String fileUrl)    
  5.     throws java.io.IOException, MalformedURLException    
  6.   {    
  7.     String type = null;    
  8.     URL u = new URL(fileUrl);    
  9.     URLConnection uc = null;    
  10.     uc = u.openConnection();    
  11.     type = uc.getContentType();    
  12.     return type;    
  13.   }    
  14.     
  15.   public static void main(String args[]) throws Exception {    
  16.     System.out.println(FileUtils.getMimeType("file://c:/temp/test.TXT"));    
  17.     // output :  text/plain    
  18.   }    
  19. }    

4、javax.activation.MimetypesFileTypeMap 
需要引入activation.jar这个jar包 , 他可以从下面这个网站获得http://java.sun.com/products/javabeans/glasgow/jaf.html
这个MimetypesFileMap类会映射出一个file的Mime Type,这些Mime Type类型是在activation.jar包里面的资源文件中定义的 
自带的mime-type列表中的数量有限,但是它提供了方法让您可以很方便的添加更多的mime类型 

MimetypesFileTypeMap 会在用户系统的很多地方去查找文件的MIME类型。当一个查找MIME类型的请求到达后,他会按照下面这个顺序去查找MIME类型 

首先通过程序将文件添加到MimetypesFileTypeMap的一个实例中 
查找用户的home路径下的文件 .mime.types 
查找文件  <java.home>/lib/mime.types 
查找文件或者资源 META-INF/mime.types 
查找文件或者资源 META-INF/mimetypes.default (一般只在 activation.jar 中去查找). 

当你需要处理一个传入的一般文件命名的文件的时候,这个方法是非常有趣的。结果出来的速度很快,因为只有扩展名被用来猜测文件的自然属性 
示例代码
[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. import javax.activation.MimetypesFileTypeMap;    
  2. import java.io.File;    
  3.     
  4. class GetMimeType {    
  5.   public static void main(String args[]) {    
  6.     File f = new File("gumby.gif");    
  7.     System.out.println("Mime Type of " + f.getName() + " is " +    
  8.                          new MimetypesFileTypeMap().getContentType(f));    
  9.     // expected output :    
  10.     // "Mime Type of gumby.gif is image/gif"    
  11.   }    
  12. }    

0 0
原创粉丝点击