1、mime-util:
该工具可以通过 检测文件扩展名,或者检测magic header 两种技术方式来实现mime类型的检测。
比较可靠,而且轻量级、只依赖于slf4j一个包? 。2010年后就没有更新了。
POM
? ? eu.medsea.mimeutil
? ? mime-util
? ? 2.1.3
示例代码:
import eu.medsea.mimeutil.MimeUtil;?
public class Main {?
? ? public static void main(String[] args) {?
? ? ? ? MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");?
? ? ? ? File f = new File ("c:/temp/mime/test.doc");?
? ? ? ? Collection> mimeTypes = MimeUtil.getMimeTypes(f);?
? ? ? ? System.out.println(mimeTypes);?
? ? ? ? //? output : application/msword?
? ? }?
}?
2、JMimeMagic
通过检测文件后缀名去查找文件类型显然不是一个健壮的方法。
JMimeMagic是一个通过检查magic headers来判断文件或者流的mime 类型的java工具包 。
目前还在持续更新当中、推荐使用。
POM
? ? net.sf.jmimemagic
? ? jmimemagic
? ? 0.1.4
示例代码
Magic parser = new Magic() ;?
// getMagicMatch accepts Files or byte[],?
// which is nice if you want to test streams?
MagicMatch match = parser.getMagicMatch(new File("gumby.gif"));?
System.out.println(match.getMimeType()) ;?
3、java.net.URL
与上面所说的匹配后缀名类似。后缀名和mime-type的映射关系被定义在[jre_home]\lib\content-types.properties
该组件只根据文件扩展名判断mime-type。不是很可靠。
示例代码(推荐)
import java.net.FileNameMap;?
import java.net.URLConnection;?
?
public class FileUtils {?
?
? public static String getMimeType(String fileUrl)?
? ? ? throws java.io.IOException?
? ? {?
? ? ? FileNameMap fileNameMap = URLConnection.getFileNameMap();?
? ? ? String type = fileNameMap.getContentTypeFor(fileUrl);?
?
? ? ? return type;?
? ? }?
?
? ? public static void main(String args[]) throws Exception {?
? ? ? System.out.println(FileUtils.getMimeType("file://c:/temp/test.TXT"));?
? ? ? // output :? text/plain?
? ? }?
? }
示例代码(不推荐:这种方式也是通过扩展名判断mime type的、而且速度很慢)
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?
? }?
}?
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
查找文件? /lib/mime.types
查找文件或者资源 META-INF/mime.types
查找文件或者资源 META-INF/mimetypes.default (一般只在 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"?
? }?
}?