Verificando se um arquivo é binário

Olá pessoal,

No endereço abaixo foi postado método para verificar se um arquivo é binário.

public boolean isBinaryFile(String file){
boolean isBinary = false;
BufferedReader in = null;
try {
/*Reads the file*/
in = new BufferedReader(new FileReader(file));
String str;
/*Walking through the file until a binary character is founded*/
while((str = in.readLine()) != null && !isBinary){
for (int i = 0; i < str.length(); i++){
isBinary = (int) str.charAt(i) > 127;
}
}
in.close();
} catch (FileNotFoundException e) {

} catch (IOException e) {

}
return isBinary;
}

http://blowingjava.blogspot.com/

Abraço a todos,

gqueiroz

editado pela moderação: marketing gratuito tem limite. Adicionei o código ao post.

O seu programa dá “falsos positivos” para o caso de arquivos-texto com caracteres acentuados.
Também dá problemas no caso de o arquivo-texto ter sido salvo em Unicode ou UTF-8 (o Notepad do Windows XP e 2003 tem dessas coisas).
Uma regra que antigamente se usava era a seguinte:

  • Ler os primeiros 1024 bytes
  • Se houver um zero binário entre eles, o arquivo é binário.

Essa regra não vale mais por causa dos tais arquivos texto em Unicode.
Nesse caso a regra é um pouco diferente:

  • Se o início do arquivo for FE FF, pode ser que seja um arquivo-texto em Unicode (little-endian).
  • Se o início do arquivo for FF FE, pode ser que seja um arquivo-texto em Unicode (big-endian).
  • Se o início do arquivo for EF BB BF, pode ser que seja um arquivo-texto em UTF-8.

Obrigado, thingol,

esse foi o meu objetivo ao postar o codigo. Estava precisando que alguem o validasse.

Sendo assim, agradeço pelos esclarecimentos.

gqueiroz