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