Java 使用JMimeMagic进行MIME类型检查-MagicMatchNotFoundException

Java 使用JMimeMagic进行MIME类型检查-MagicMatchNotFoundException,java,exception,mime-types,Java,Exception,Mime Types,我需要检查MIME类型的当前文件。如果结果为success且文件具有MIME类型,则返回true。如果没有检查成功返回false 我用这个目标。 我试着这么做 此代码的输出为-net.sf.jmimemagic.MagicMatchNotFoundException 您需要有jdk7-才能以这种方式将文件更改为字节[](Files.readAllBytes(path)) 代码: class ProbeContentTypeCheker implements Checker {

我需要检查MIME类型的当前文件。如果结果为success且文件具有MIME类型,则返回true。如果没有检查成功
返回false

我用这个目标。
我试着这么做

此代码的输出为-
net.sf.jmimemagic.MagicMatchNotFoundException

您需要有jdk7-才能以这种方式将文件更改为字节[](
Files.readAllBytes(path)

代码:

    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)
问题:

 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)  
  • 如何解决这一异常问题
JMimeMagic依赖于Commons Logging 1.0.4 表示Java虚拟机或ClassLoader实例尝试加载类的定义(作为普通方法调用的一部分或使用新表达式创建新实例的一部分),但找不到该类的定义。 解决方案是将commons-logging-1.0.4.jar添加到类路径中

请注意,JMimeMagic还有其他功能:

  • 雅加达ORO 2.0.8
  • Log4j 1.2.8
  • Xerces 2.4.0(可选)
  • xml API 2.0.2
  • xmlParserAPIs 2.0.2
  • 更新-MagicMatchNotFoundException

    如果未找到所提供数据的mime类型匹配项,将引发。 您可以将
    net.sf.jmimemagic
    的日志级别设置为DEBUG,以获取有关正在进行的操作的更多信息

    更新2-OutOfMemoryError

    OOM看起来与JmimeMagic的行为有关。在某些情况下,它会尝试对整个字节数组输入运行正则表达式,以找到幻数匹配。有关Nuxeo企业平台,请参阅此报告。

    我认为可以通过限制传递给
    getMagicMatch

    Does
    commons-logging-1.0.4.jar
    means
    log4j1.2.8
    ?我添加了库
    commons-logging-1.1.jar
    。输出到控制台(红色):
    Мааimk 112013 2:00:36 PM net.sf.jmimemagic.MagicParser-endElement信息:endElement():不添加无效的匹配器“320 kBits”
    NoClassDefFoundError:org/apache/oro/text/perl/Perl5Util
    您需要添加我在回答中指定的所有其他库。请仅为每个“坏”文件向问题添加完整的堆栈跟踪。如果它是“ok”文件=>以正常方式输出。结果是
    java.lang.OutOfMemoryError:java堆空间
    。为什么会发生这种情况?