Pergunta

Ou seja, como é que você diga a um arquivo JAR (/ rar / etc.) A partir de um texto (xml / txt, codificando-independente) um?

Foi útil?

Solução

Não há nenhuma maneira garantida, mas aqui estão algumas possibilidades:

1) Procure um cabeçalho no arquivo. Infelizmente, os cabeçalhos são específicos do arquivo, por isso, enquanto você pode ser capaz de descobrir que ele é um arquivo RAR, você não vai obter a resposta mais genérica de se tratar de texto ou binário.

2) Contar o número de caracteres versus não-tipos de caracteres. arquivos de texto será caracteres alfabéticos principalmente enquanto arquivos binários - especialmente os comprimidos como RAR, ZIP, e tal -. tendem a ter bytes mais uniformemente representada

3) Procure por um padrão de repetição regular de novas linhas.

Outras dicas

Executar file -bi {filename}. Se o que quer que retorna começa com 'text /', então é não-binário, caso contrário ele é. ; -)

Eu fiz este. Um pouco mais simples, mas para línguas latinas à base, ele deve funcionar bem, com o ajuste da proporção.

/**
 *  Guess whether given file is binary. Just checks for anything under 0x09.
 */
public static boolean isBinaryFile(File f) throws FileNotFoundException, IOException {
    FileInputStream in = new FileInputStream(f);
    int size = in.available();
    if(size > 1024) size = 1024;
    byte[] data = new byte[size];
    in.read(data);
    in.close();

    int ascii = 0;
    int other = 0;

    for(int i = 0; i < data.length; i++) {
        byte b = data[i];
        if( b < 0x09 ) return true;

        if( b == 0x09 || b == 0x0A || b == 0x0C || b == 0x0D ) ascii++;
        else if( b >= 0x20  &&  b <= 0x7E ) ascii++;
        else other++;
    }

    if( other == 0 ) return false;

    return 100 * other / (ascii + other) > 95;
}

Tenha um olhar para o JMimeMagic biblioteca.

jMimeMagic é uma biblioteca Java para determinar o tipo MIME de arquivos ou riachos.

Usando classe Java 7 Arquivos http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#probeContentType (java.nio.file.Path)

boolean isBinaryFile(File f) throws IOException {
        String type = Files.probeContentType(f.toPath());
        if (type == null) {
            //type couldn't be determined, assume binary
            return true;
        } else if (type.startsWith("text")) {
            return false;
        } else {
            //type isn't text
            return true;
        }
    }

Eu usei esse código e ele funciona para Inglês e texto em alemão muito bem:

private boolean isTextFile(String filePath) throws Exception {
    File f = new File(filePath);
    if(!f.exists())
        return false;
    FileInputStream in = new FileInputStream(f);
    int size = in.available();
    if(size > 1000)
        size = 1000;
    byte[] data = new byte[size];
    in.read(data);
    in.close();
    String s = new String(data, "ISO-8859-1");
    String s2 = s.replaceAll(
            "[a-zA-Z0-9ßöäü\\.\\*!\"§\\$\\%&/()=\\?@~'#:,;\\"+
            "+><\\|\\[\\]\\{\\}\\^°²³\\\\ \\n\\r\\t_\\-`´âêîô"+
            "ÂÊÔÎáéíóàèìòÁÉÍÓÀÈÌÒ©‰¢£¥€±¿»«¼½¾™ª]", "");
    // will delete all text signs

    double d = (double)(s.length() - s2.length()) / (double)(s.length());
    // percentage of text signs in the text
    return d > 0.95;
}

Se o arquivo consiste nos bytes 0x09 (guia), 0x0A (avanço de linha), 0x0C (alimentação de formulário), 0x0D (retorno de carro), ou 0x20 através 0x7E, então provavelmente é texto ASCII.

Se o arquivo contém qualquer outro caractere de controle ASCII, 0x00 através 0x1F excluindo os três acima, então provavelmente é dados binários.

UTF-8 texto segue um padrão muito específico para quaisquer bytes com o bit de alta ordem, mas codificações de comprimento fixo como ISO-8859-1 não. UTF-16 pode frequentemente conter o byte nulo (0x00), mas apenas em cada outra posição.

Você precisa de uma heurística mais fraco para qualquer outra coisa.

Apenas para que você saiba, eu escolhi um caminho bem diferente. I meu caso, há apenas 2 tipos de arquivos, as chances de que um determinado arquivo será um binário são elevados. Então

  1. presumir que arquivo é binário, tente fazer o que é suposto ser feito (por exemplo deserialize)
  2. exceção captura
  3. arquivo tratar como textuais
  4. se isso falhar, algo está errado com o próprio arquivo

Você poderia tentar a ferramenta DROID .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top