Как точно определить данные MIME из файла?

Я добавляю некоторые функции в программу, чтобы я мог точно определять тип файлов, читая данные 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, которую использует метод.

Я осмотрелся, и некоторые люди говорят, что это связано с тем, как смещение определяется в файлах, и поэтому тип содержимого определяется неправильно, как указано в этой вики об обнаружении типы файлов в PHP. К сожалению, затем вики продолжает использовать расширение для определения типа файла, чего я не хочу делать, так как это ненадежно.

Может ли кто-нибудь указать мне в правильном направлении к методу, который будет правильно определять типы файлов в Java, пожалуйста?

Ура, Алексей Синий.

Изменить: Похоже, что для этого нет конкретного решения, как сказал @IronMensan в комментарии ниже.Я нашел эту действительно интересную исследовательскую статью , в которой машинное обучение применяется несколькими способами, чтобы решить эту проблему, но, похоже, на нее нет полного доказательного ответа. Я думаю, что лучше всего здесь будет попытаться передать файл программе чтения файлов Excel и отловить любые исключения неправильного формата.

14
задан Alexei Blue 15 December 2011 в 20:58
поделиться