Как проверить, читается ли файл человеком?

Как я могу убедиться, что файл читается людьми.

Таким образом, я действительно хочу проверить, является ли файл txt, a yml, a doc, a json и т.д.

Проблема в том, что в случае, когда я хочу выполнить эту проверку, расширения файлов вводят в заблуждение, и я имею в виду, что обычный текстовый файл (это должен быть .txt) имеет расширение .d и другие: - (

Каков наилучший способ проверить, что файл может быть прочитан людьми?

До сих пор я пробовал свою удачу с расширениями следующим образом:

private boolean humansCanRead(String extention) {
        switch (extention.toLowerCase()) {
        case "txt":
        case "doc":
        case "json":
        case "yml":
        case "html":
        case "htm":
        case "java":
        case "docx":
            return true;
        default:
            return false;
        }
    }

Но поскольку я сказал, что расширения не так ожидаются.

EDIT: Чтобы уточнить, я ищу решение, которое является платформой независимо и без использования внешних библиотек. И чтобы сузить, что я имею в виду "читаемый человеком", я имею в виду простые текстовые файлы, содержащие символы любого языка, а также я на самом деле не возражаете, если текст в файле имеет смысл, как если бы он был закодирован, на данный момент я действительно не волнуюсь.

Спасибо за все ответы!: D

Ответ 1

Для некоторых файлов проверка количества байтов в печатном диапазоне ASCII поможет. Если более 75% байтов находятся в этом диапазоне в пределах первых нескольких сотен байт, то это, вероятно, "читаемо".

Некоторые файлы имеют заголовки, такие как различные формы BoM в файлах UTF, 0xA5EC, который запускает файлы MS doc или подпись "MZ" в начале .exe, которая сообщит вам, является ли файл доступным для чтения или нет.

Многие современные текстовые файлы находятся в одном из форматов UTF, которые обычно можно идентифицировать, читая первый фрагмент файла, даже если у них нет BoM.

В принципе, вам нужно будет запускать множество разных типов файлов, чтобы узнать, есть ли у вас совпадение. Загрузите первый килобайт файла в память и запустите много разных проверок. После того, как у вас есть данные, вы можете сначала заказать проверки для поиска наиболее распространенных форматов.

Ответ 2

В общем, вы не можете этого сделать. Вы можете использовать алгоритм идентификации языка, чтобы угадать, является ли данный текст текстом, который может быть произнесен людьми. Так как ваш пример содержит формальные языки, такие как html, однако, у вас есть некоторые серьезные проблемы. Если вы действительно хотите реализовать свой чек на (конечный набор) формальных языков, вы можете использовать анализатор GLR для анализа (двусмысленного) грамматика, которая объединяет все эти языки. Однако это еще не решило проблему синтаксических ошибок (хотя можно было бы определить эвристику). Наконец, вам нужно подумать о том, что вы на самом деле имеете в виду под "удобочитаемым человеком": например. вы включаете Base64?

edit: Если вас интересует только набор символов: см. ответ на этот вопрос. В основном, вы должны прочитать файл и проверить, является ли контент действительным в любой кодировке символов, которую вы считаете правдоподобной (utf-8 должен охватывать большинство ваших реальных случаев).