Как узнать, является ли файл рендерингом текста или нет?(Джава) - PullRequest
2 голосов
/ 17 ноября 2011

Как я могу узнать во время выполнения, является ли файл в указанной папке текстовым рендерингом или нет?(т.е. файлы, такие как csv, html и т. д., которые могут отображаться в виде текста)

Я не хочу делать это с помощью сопоставления расширений (путем проверки расширений .txt, .html и т. д.).

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

Как мне добиться этого в Java?

Ответы [ 6 ]

1 голос
/ 17 ноября 2011

Вы можете угадать тип, отсканировав файл и используя Character.html # isISOControl , чтобы проверить, есть ли в нем непечатный символ.

Двоичные файлы обычно включают заголовки, которые часто содержат контрольные символы. См. Этот список сигнатур файлов большинство из них будет обнаружено isISOControl.

1 голос
/ 17 ноября 2011

Реализация эвристического сопоставления, который сканирует файлы на наличие известных сигнатур.

Классическим примером является команда file: http://en.wikipedia.org/wiki/File_(command) и библиотека libmagic.

В Java есть несколько вариантов, например, Tika: http://tika.apache.org/

0 голосов
/ 21 июня 2012

Использование символов # isISOControl - это хорошо.Вы также должны принять во внимание кодировку (p.ex.UTF-8).Вот моя функция:

/**
 * Test is a file is a text file. It is the case only if it has no well-known control characters.
 * (see {@link Character#isISOControl(int)})
 * @param file
 * @return
 * @throws IOException
 */
public static boolean isTextFile (final File file) throws IOException
{
    BufferedInputStream is = null;
    try
    {
        final BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-16"));

        boolean isText;
        int read;
        do
        {
            read = in.read();
            isText = read == -1;
            isText |= read == 13;  // newline
            isText |= read == 10;  // newline
            isText |= read == 9;   // tab
            isText |= !Character.isISOControl(read);
        }
        while (isText && read != -1);

        return isText;
    }
    finally {
        if (is != null)
        {
            try
            {
                is.close();
            }
            catch (IOException e)
            {
                throw new Error(e);
            }
        }
    }
}
0 голосов
/ 17 ноября 2011

Вы можете сохранить список допустимых MIME-типов, а затем получить MIME-тип файла, который вы читаете.Если это соответствует хорошо, чтобы пойти.

import javax.activation.MimetypesFileTypeMap;
import java.io.File;

class GetMimeType {
  public static void main(String args[]) {
    File f = new File("gumby.gif");
    System.out.println("Mime Type of " + f.getName() + " is " +
                         new MimetypesFileTypeMap().getContentType(f));
    // expected output :
    // "Mime Type of gumby.gif is image/gif"
  }
}

http://www.rgagnon.com/javadetails/java-0487.html

0 голосов
/ 17 ноября 2011

Это вызов для некоторого статистического сопоставления с образцом.Например, вы могли бы, если вы работали только с английским языком, проверить, сколько «иностранных» символов появляется в первых 100 символах.Это должно дать вам довольно хорошее представление о том, является ли это текстовым документом или нет.Если вы встретите слишком много символов, которые не являются ... zA..Z0..9 [пунктуация], то вы можете догадаться, что это не текст.Работая с англоязычными файлами и языками, которые можно выразить, используя в основном список символов ASCII, вы должны быть относительно безопасны.

Это, конечно, выходит из окна в тот момент, когда вы начинаете работать с иностранными языками, где некоторыеиз символов может показаться специальными символами, но только для тех, кто не говорит на этом языке.

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

0 голосов
/ 17 ноября 2011

Я не думаю, что есть 100% надежный способ сделать это, так как это вопрос мнения, который считается "может быть отображен как текст" ... но если вы согласны с ограничением текста на английском языкеВы можете проверить байты файла, и если большинство или все байтовые значения находятся в диапазоне от 32 до 126 (десятичное число без знака), то, скорее всего, ванильный текст ASCII .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...