1、mime-util:
該工具可以通過 檢測文件擴展名,或者檢測magic header 兩種技術方式來實現mime類型的檢測。
比較可靠,而且輕量級、只依賴於slf4j一個包 。2010年後就沒有更新了。
POM
<dependency>
<groupId>eu.medsea.mimeutil</groupId>
<artifactId>mime-util</artifactId>
<version>2.1.3</version>
</dependency>
示例代碼:
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
<dependency>
<groupId>net.sf.jmimemagic</groupId>
<artifactId>jmimemagic</artifactId>
<version>0.1.4</version>
</dependency>
示例代碼
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
查找文件 <java.home>/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"
}
}