2013-03-10 37 views
4

我需要檢查MIME類型的currentFile。如果結果爲成功,並且文件具有MIME類型return true。如果沒有檢查成功return false
有了這個目標,我使用JMimeMagic
我嘗試這樣做according this post使用JMimeMagic進行MIME類型檢查 - MagicMatchNotFoundException

輸出從這個代碼 - net.sf.jmimemagic.MagicMatchNotFoundException

你需要有JDK 7 - 在這種方式(Files.readAllBytes(path))更改文件爲byte []。

代碼:

class ProbeContentTypeCheker implements Checker { 

    @Override 
    public boolean check(File currentFile) { 
     String mimeType = null; 
     try { 
      Path path = Paths.get(currentFile.getAbsolutePath()); 
      byte[] data = Files.readAllBytes(path); 
      MagicMatch match = Magic.getMagicMatch(data); 
      mimeType = match.getMimeType(); 
     } catch (MagicParseException | MagicMatchNotFoundException 
       | MagicException | IOException e) { 
      e.printStackTrace(); 
     } 

     if (null != mimeType) { 
      return true; 
     } 

     return false; 
    } 
} 

輸出(只有當它的 「壞」):

net.sf.jmimemagic.MagicMatchNotFoundException 
    at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:222) 
    at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:170) 
    at task.ProbeContentTypeCheker.check(FileScan.java:357) 
    at task.FolderScan.findFiles(FileScan.java:223) 
    at task.FolderScan.findFiles(FileScan.java:215) 
    at task.FolderScan.run(FileScan.java:202) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 

如果文件是 「OK」 型=>輸出到控制檯正常。但一段時間後出現另一個例外

Exception in thread "pool-1-thread-1" java.lang.OutOfMemoryError: Java heap space 
    at java.lang.String.toCharArray(String.java:2753) 
    at org.apache.oro.text.perl.Perl5Util.match(Unknown Source) 
    at net.sf.jmimemagic.MagicMatcher.testRegex(MagicMatcher.java:663) 
    at net.sf.jmimemagic.MagicMatcher.testInternal(MagicMatcher.java:433) 
    at net.sf.jmimemagic.MagicMatcher.test(MagicMatcher.java:341) 
    at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:208) 
    at net.sf.jmimemagic.Magic.getMagicMatch(Magic.java:170) 
    at task.ProbeContentTypeCheking.check(FileScan.java:384) 
    at task.FolderScan.findFiles(FileScan.java:228) 
    at task.FolderScan.findFiles(FileScan.java:225) 
    at task.FolderScan.findFiles(FileScan.java:225) 
    at task.FolderScan.run(FileScan.java:209) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 

問:

  • 如何解決這個問題出現的異常?

回答

3

JMimeMagic 0.1.2取決於共享日誌記錄1.0.4 甲NoClassDefFoundError意味着Java虛擬機或ClassLoader實例試圖在類的定義中加載(作爲普通方法調用的一部分,或者作爲創建的一部分一個使用新表達式的新實例),並且沒有找到該類的定義。 解決方案是將commons-logging-1.0.4.jar添加到您的類路徑中。

注意JMimeMagic有其他3rd party dependencies

  1. 雅加達ORO 2.0.8
  2. 的Log4j 1.2.8
  3. 的Xerces 2.4.0(可選)
  4. XML的API 2.0.2
  5. xmlParserAPIs 2.0.2

更新 - MagicMatchNotFoundException

如果找不到提供的數據的MIME類型匹配,則會引發MagicMatchNotFoundException。 可以的net.sf.jmimemagic日誌級別設置爲DEBUG,以獲取有關什麼是對

更新將會更多信息2 - 的OutOfMemoryError

的OOM看起來相關JmimeMagic的行爲。在某些情況下,它會嘗試對整個字節數組輸入運行正則表達式以查找幻數匹配。關於Nuxeo企業平臺,請參閱此報告的issue
我認爲你可以通過限制你傳遞的字節數組的大小來解決這個問題getMagicMatch

+0

'commons-logging-1.0.4.jar'是否意味着Log4j 1.2.8? – 2013-03-11 11:43:10

+1

不,2個不同的庫 – 2013-03-11 11:52:34

+0

我添加了庫'commons-logging-1.1.1.jar'。輸出到控制檯(紅色):'мар11,2013 2:00:36 PM net.sf.jmimemagic.MagicParser endElement INFO:endElement():不添加無效的匹配器'320 kBits'' ... NoClassDefFoundError :org/apache/oro/text/perl/Perl5Util' – 2013-03-11 12:03:03

相關問題