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