Java获取文件类型Mime Type的各种方法

使用 javax.activation.MimetypesFileTypeMap 
需要引入activation.jar这个jar包 , 他可以从下面这个网站获得http://java.sun.com/products/javabeans/glasgow/jaf.html
这个MimetypesFileMap类会映射出一个file的Mime Type,这些Mime Type类型是在activation.jar包里面的资源文件中定义的 

示例代码 

import javax.activation.MimetypesFileTypeMap;  
import java.io.File;  
  
class GetMimeType {  
  public static void main(String args[]) {  
    File f = new File("gumby.gif");  
    System.out.println("Mime Type of " + f.getName() + " is " +  
                         new MimetypesFileTypeMap().getContentType(f));  
    // expected output :  
    // "Mime Type of gumby.gif is image/gif"  
  }  
} 

 

    自带的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.net.URL 
警告:这个方法非常慢 
与上面所说的匹配后缀名类似。后缀名和mime-type的映射关系被定义在[jre_home]\lib\content-types.properties这个文件中 

 

import java.net.*;  
  
public class FileUtils{  
  public static String getMimeType(String fileUrl)  
    throws java.io.IOException, MalformedURLException  
  {  
    String type = null;  
    URL u = new URL(fileUrl);  
    URLConnection uc = null;  
    uc = u.openConnection();  
    type = uc.getContentType();  
    return type;  
  }  
  
  public static void main(String args[]) throws Exception {  
    System.out.println(FileUtils.getMimeType("file://c:/temp/test.TXT"));  
    // output :  text/plain  
  }  
} 

 

来自R. Lovelock 的笔记: 
  我尝试去找一个最好的能获取mime type的类型的方法,发现你的发现很有用,但是现在我发现,可以通过URLConnection来查找,并没有像你描述的那么慢 

 

  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.   } 

 

使用 Apache Tika 
Tika是lucene的子项目,它是通过已经存在的解析库在各种文档中查找并提取元数据和结构化文本内容的工具包。
这个包提供了罪行文件类型的支持,包括office2007(docs/pptx/xlsx/etc...) 

Apache Tika 
Tika有很多依赖包,大约有20个jar包!但是它所能做的不仅仅是检测文件类型这么简单,例如,你可以解析PDF或者DOC文件,并很容易的获取文本和元数据 

 

  1. import java.io.File;  
  2. import java.io.FileInputStream;  
  3.   
  4. import org.apache.tika.metadata.Metadata;  
  5. import org.apache.tika.parser.AutoDetectParser;  
  6. import org.apache.tika.parser.Parser;  
  7. import org.apache.tika.sax.BodyContentHandler;  
  8. import org.xml.sax.ContentHandler;  
  9.   
  10. public class Main {  
  11.   
  12.     public static void main(String args[]) throws Exception {  
  13.   
  14.     FileInputStream is = null;  
  15.     try {  
  16.       File f = new File("C:/Temp/mime/test.docx");  
  17.       is = new FileInputStream(f);  
  18.   
  19.       ContentHandler contenthandler = new BodyContentHandler();  
  20.       Metadata metadata = new Metadata();  
  21.       metadata.set(Metadata.RESOURCE_NAME_KEY, f.getName());  
  22.       Parser parser = new AutoDetectParser();  
  23.       // OOXMLParser parser = new OOXMLParser();  
  24.       parser.parse(is, contenthandler, metadata);  
  25.       System.out.println("Mime: " + metadata.get(Metadata.CONTENT_TYPE));  
  26.       System.out.println("Title: " + metadata.get(Metadata.TITLE));  
  27.       System.out.println("Author: " + metadata.get(Metadata.AUTHOR));  
  28.       System.out.println("content: " + contenthandler.toString());  
  29.     }  
  30.     catch (Exception e) {  
  31.       e.printStackTrace();  
  32.     }  
  33.     finally {  
  34.         if (is != null) is.close();  
  35.     }  
  36.   }  

 

使用JMimeMagic 
通过检测文件后缀名去查找文件类型显然不是一个健壮的方法。JMimeMagic库提供了更健壮的检测方法,他是一个通过检查magic headers来判断文件或者流的mime 类型的java工具包 

// snippet for JMimeMagic lib 
//     http://sourceforge.net/projects/jmimemagic/ 

 

  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()) ;  

 

使用 mime-util 

另一个工具是mime-util,这个工具可以通过 检测文件扩展名,或者检测magic header 两种技术方式来实现mime类型的检测 

 

  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.     }  

 

mime-util的比较好的一点是它是轻量级的,只依赖于slf4j一个包 


英文水平有限,就是大体意思,原文地址 http://www.rgagnon.com/javadetails/java-0487.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值