gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:08:12 25 4
gpt4 key购买 nike

我需要检查 MIME 类型的 currentFile。如果结果成功并且文件具有 MIME 类型返回 true。如果没有检查成功 return false
为了这个目标,我使用 JMimeMagic .
我试着这样做 according this post

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

您需要有 JDK 7 - 以这种方式将 File 更改为 byte[] (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)

问题:

  • 如何解决这个出现的异常?

最佳答案

JMimeMagic 0.1.2取决于 Commons Logging 1.0.4NoClassDefFoundError意味着 Java 虚拟机或 ClassLoader 实例试图加载类的定义(作为正常方法调用的一部分或作为使用 new 表达式创建新实例的一部分)并且找不到类的定义。解决方案是将 commons-logging-1.0.4.jar 添加到您的类路径中。

请注意 JMimeMagic 还有其他 3rd party dependencies :

  1. Jakarta ORO 2.0.8
  2. Log4j 1.2.8
  3. Xerces 2.4.0(可选)
  4. xml-apis 2.0.2
  5. xmlParserAPIs 2.0.2

更新 - MagicMatchNotFoundException

MagicMatchNotFoundException如果未找到提供的数据的 MIME 类型匹配,则抛出。您可以将 net.sf.jmimemagic 的日志级别设置为 DEBUG 以获取有关正在发生的事情的更多信息

更新 2 - OutOfMemoryError

OOM 看起来与 JmimeMagic 的行为有关。在某些情况下,它会尝试对整个字节数组输入运行正则表达式以找到魔数(Magic Number)匹配。看这篇报道issue适用于 Nuxeo 企业平台。
我认为您可以通过限制传递给 getMagicMatch

的字节数组的大小来解决这个问题

关于java - 使用 JMimeMagic 进行 MIME 类型检查 - MagicMatchNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15325047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com