標籤:
本文轉載自:http://hotsunshine.iteye.com/blog/857485
使用 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來尋找,並沒有像你描述的那麼慢
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/
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()) ;
使用 mime-util
另一個工具是mime-util,這個工具可以通過 檢測副檔名,或者檢測magic header 兩種技術方式來實現mime類型的檢測
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
}
}
mime-util的比較好的一點是它是輕量級的,只依賴於slf4j一個包
java中得到檔案MIME類型的幾種方法(轉)