2012-12-08 24 views
3

在我下面的代碼:的Java得到的內容文件類型無法按預期工作

MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector"); 
File f = new File ("c:\\temp\\mime\\java.exe"); 
Collection<?> mimeTypes = MimeUtil.getMimeTypes("c:\\temp\\mime\\java.exe"); 
MimeType m = mimeTypes.toArray(new MimeType[mimeTypes.size()])[0]; 
System.out.println(m); 

輸出始終應用程序/八位字節流不管是什麼文件類型選擇,即CSV,XLS EXE等

但根據以下站點:

http://www.rgagnon.com/javadetails/java-0487.html

它應該顯示像MS-字或MS-Excel的等

如何使這項工作?我想要的只是從文件內容中獲取文件類型(而不是使用不太可靠的文件擴展名)。我正在閱讀其他選項,比如需要太多文件(比如20)的tika,這對於這個單一目的來說太多了,而JMimeMagic需要apache-oro,這是一個死了的項目,因此我也不喜歡這個想法。所有其他解決方案似乎都依賴於文件擴展名,這似乎不像上面提到的那樣可靠。

感謝

+0

你看到了http://stackoverflow.com/questions/51438/getting-a-files-mime-type-in​​-java? –

+0

當然可以。該帖子完全是指我上面提到的鏈接,我只是從該網站複製粘貼代碼片段。 –

+0

可能相關 - 我在linux上遇到類似的問題。我使用的是mime-util-2.1.3.jar,它檢測一些純文本文件,如.txt,MANIFEST.MF(文本文件)和.jsp作爲[application/octet-stream]。不過,它對許多otehr文件類型正常工作。在Linux上,如果我在這些相同的文本文件上從命令行「文件-i」或「mimetype -M」運行,我會得到正確的mimetype。 –

回答

1

好吧,我想我想通了這一點爲自己(和你)......我看着作者的單元測試,特別是MimeUtilTest.java你瞧,他這樣做的單元測試setup(): MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector"); MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.ExtensionMimeDetector"); MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.OpendesktopMimeDetector");

我和你一樣,只是註冊了第一個MagicMimeMimeDetector。一旦我加入其他兩個,它就開始正常工作了。

+0

你能夠註冊'MimeUtil.registerMimeDetector(「eu.medsea.mimeutil.detector.OpendesktopMimeDetector」);'?我在註冊時遇到異常 – kittu

+0

它對我有效 - 你有什麼異常?也許在我發佈這個答案後的2.5年內,APi發生了變化? –

1

尊重操作系統,所以你可以嘗試:

MimeUtil 
     .registerMimeDetector(System.getProperty("os.name").startsWith(
       "Windows") ? "eu.medsea.mimeutil.detector.WindowsRegistryMimeDetector" 
       : "eu.medsea.mimeutil.detector.OpendesktopMimeDetector");