Я добавляю некоторые функции в программу, чтобы я мог точно определить тип файлов, читая данные 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?
Cheers, Алексей Синий.
Изменить: похоже, нет конкретного решения для этого, как сказал @IronMensan в комментарии ниже. Я нашел этот действительно интересный исследовательский документ, который применяет машинное обучение несколькими способами, чтобы помочь решить проблему, но, похоже, нет полного доказательства ответ. Я считаю, что лучше всего попытаться передать файл в считыватель файлов excel и уловить любые неправильные исключения в формате.