如何从文件中准确确定哑剧数据?
我正在向程序添加一些功能,以便我可以通过读取MIME数据来准确确定文件类型。我已经尝试了几种方法:
方法 1:
javax.activation.FileDataSource
FileDataSource ds = new FileDataSource("~\\Downloads\\777135_new.xls");
String contentType = ds.getContentType();
System.out.println("The MIME type of the file is: " + contentType);
//output = The MIME type of the file is: application/octet-stream
方法 2:
import net.sf.jmimemagic.*;
try
{
RandomAccessFile f = new RandomAccessFile("~\\Downloads\\777135_new.xls", "r");
byte[] fileBytes = new byte[(int)f.length()];
f.read(fileBytes);
MagicMatch match = Magic.getMagicMatch(fileBytes);
System.out.println("The Mime type is: " + match.getMimeType());
}
catch(Exception e)
{
System.out.println(e);
}
//output = The Mime type is: application/msword
方法 3:
import eu.medsea.mimeutil.*;
MimeUtil.registerMimeDetector("eu.medsea.mimeutil.detector.MagicMimeMimeDetector");
File f = new File ("~\\Downloads\\777135_new.xls");
Collection<?> mimeTypes = MimeUtil.getMimeTypes(f);
String mimeType = MimeUtil.getFirstMimeType(mimeTypes.toString()).toString();
String subMimeType = MimeUtil.getSubType(mimeTypes.toString());
System.out.println("The Mime type is: " + mimeTypes + ", " + mimeType + ", " + subMimeType);
//output = The Mime type is: application/msword, application/msword, msword
我在 http://www.rgagnon.com/javadetails/java-0487.html 找到了这三种方法。然而,我的问题是,我正在测试这些方法的文件是我创建的一个文件,所以我知道它是一个Excel文件,但是除了第一种方法之外,所有三种方法仍然错误地将类型选择为msword,我相信这是因为该方法使用的内置FileTypeMap中的文件类型数量有限。
我环顾四周,有些人说这是因为在文件中检测偏移的方式,因此内容类型被错误地拾取,正如这个wiki中关于检测PHP中的文件类型所指出的那样。不幸的是,wiki继续使用扩展名来确定文件类型,这不是我想要做的,因为它不可靠。
任何人都可以为我指出正确的方向,以找到一种可以在Java中正确检测文件类型的方法吗?
干杯,阿列克谢·布鲁。
编辑:似乎没有具体的解决方案,正如@IronMensan在下面的评论中所说的那样。我确实发现了这篇非常有趣的研究论文,它以多种方式应用机器学习来帮助解决这个问题,但似乎没有一个完整的证据答案。我认为我在这里最好的选择是尝试将文件传递给excel文件阅读器并捕获任何不正确的格式异常。