我需要检查MIME类型的currentFile
。如果结果成功且文件具有MIME类型return true
。如果没有检查成功return false
有了这个目标,我使用了JMimeMagic
我尝试这样做according this post
此代码的输出为 - net.sf.jmimemagic.MagicMatchNotFoundException
您需要 JDK 7 - 以这种方式将文件更改为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)
问题:
答案 0 :(得分:3)
JMimeMagic 0.1.2依赖于Commons Logging 1.0.4 NoClassDefFoundError表示Java虚拟机或ClassLoader实例尝试加载类的定义(作为普通方法调用的一部分或作为使用新表达式创建新实例的一部分)并且没有定义可以找到这个班级。 解决方案是将commons-logging-1.0.4.jar添加到类路径中。
请注意,JMimeMagic还有其他3rd party dependencies:
更新 - MagicMatchNotFoundException
如果找不到所提供数据的mime类型匹配,则抛出MagicMatchNotFoundException。
您可以将net.sf.jmimemagic
的日志级别设置为DEBUG以获取有关正在进行的操作的更多信息
更新2 - OutOfMemoryError
OOM看起来与JmimeMagic的行为有关。在某些情况下,它会尝试对整个字节数组输入运行正则表达式,以找到幻数匹配。有关Nuxeo Enterprise Platform,请参阅此报告的issue
我认为你可以通过限制传递给getMagicMatch