使用 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這個文件中
來自R. Lovelock 的筆記:
我嘗試去找一個最好的能獲取mime type的類型的方法,發現你的發現很有用,但是現在我發現,可以通過URLConnection來查找,並沒有像你描述的那么慢
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
}
}
}
使用 Apache Tika
Tika是lucene的子項目,它是通過已經存在的解析庫在各種文檔中查找並提取元數據和結構化文本內容的工具包。
這個包提供了罪行文件類型的支持,包括office2007(docs/pptx/xlsx/etc...)
Apache Tika
Tika有很多依賴包,大約有20個jar包!但是它所能做的不僅僅是檢測文件類型這么簡單,例如,你可以解析PDF或者DOC文件,並很容易的獲取文本和元數據
import java.io.File;
import java.io.FileInputStream;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.Parser;
import org.apache.tika.sax.BodyContentHandler;
import org.xml.sax.ContentHandler;
public class Main {
public static void main(String args[]) throws Exception {
FileInputStream is = null;
try {
File f = new File("C:/Temp/mime/test.docx");
is = new FileInputStream(f);
ContentHandler contenthandler = new BodyContentHandler();
Metadata metadata = new Metadata();
metadata.set(Metadata.RESOURCE_NAME_KEY, f.getName());
Parser parser = new AutoDetectParser();
// OOXMLParser parser = new OOXMLParser();
parser.parse(is, contenthandler, metadata);
System.out.println("Mime: " + metadata.get(Metadata.CONTENT_TYPE));
System.out.println("Title: " + metadata.get(Metadata.TITLE));
System.out.println("Author: " + metadata.get(Metadata.AUTHOR));
System.out.println("content: " + contenthandler.toString());
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (is != null) is.close();
}
}
}
使用JMimeMagic
通過檢測文件后綴名去查找文件類型顯然不是一個健壯的方法。JMimeMagic庫提供了更健壯的檢測方法,他是一個通過檢查magic headers來判斷文件或者流的mime 類型的java工具包
// snippet for JMimeMagic lib
// http://sourceforge.net/projects/jmimemagic/
使用 mime-util
另一個工具是mime-util,這個工具可以通過 檢測文件擴展名,或者檢測magic header 兩種技術方式來實現mime類型的檢測
mime-util的比較好的一點是它是輕量級的,只依賴於slf4j一個包