Определение типа сжатия с помощью Apache Commons Compress - PullRequest
0 голосов
/ 20 августа 2011

Существует ли быстрый способ надежного определения типа сжатия файла по его содержимому (т.е. не по расширению файла) с использованием Apache Commons Compress API?

Используя Apache Tika , можно сделать

Tika tika = new Tika();
String path = <the full path to the file examined, including the filename>;
FileInputStream fis = new FileInputStream(new File(path));
String type = tika.detect(fis);

и переменная type заполняется обнаруженным MIME-типом содержимого файла (например, text / plain, application / zip и т. Д.).

В идеале, я хотел бы избежать вовлечения Тики в этот процесс по многим причинам, включая тот факт, что Тика, похоже, неправильно определяет как «текст / обычный» формат архива AR, который является одним из тех, которые создаются Commons Compress.

1 Ответ

1 голос
/ 22 августа 2011

Лучше всего будет взять первые несколько байтов из файла и проверить их на наличие шаблонов байт-мимов в различных форматах, которые вас интересуют.

Это то, что сделает Тикасделать для вас, когда вы попросите сделать обнаружение.Однако вы можете написать свой собственный код

. Возможно, можно передать поток каждому декодеру Commons Compress по очереди и предположить, что первый, который не сработает, это формат, но это может быть немногоненадежный ...

Я бы посоветовал вам придерживаться Tika, и для любого формата, который в данный момент не поддерживается Tika, откройте отчет об ошибке для обнаружения проблемы.Если вы можете, загрузите очень маленький тестовый файл, который можно использовать в модульном тесте, и, если возможно, тоже байты обнаружения магии.(Для формата, поддерживаемого компрессией commons, вы должны быть в состоянии найти детали заголовка в коде компрессии commons при необходимости)

...