2013-03-10 119 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