java读取文件所有内容 - 字节流读取文件




在Java中确定二进制/文本文件类型? (7)

我使用了这段代码,它适用于英语和德语文本:

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ßöäü\\.\\*!\"§\\$\\%&/()=\\[email protected]~'#:,;\\"+
            "+><\\|\\[\\]\\{\\}\\^°²³\\\\ \\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;
}

也就是说,如何从文本(xml / txt,独立于编码)文件中记录存档(jar / rar / etc。)文件?


你可以试试DROID工具。


只是为了让你知道,我选择了一条完全不同的道路。 我的情况是,只有两种类型的文件,任何给定文件都是二进制文件的可能性很高。 所以

  1. 假设文件是​​二进制的,尝试做应该做的事情(例如反序列化)
  2. 抓住异常
  3. 将文件视为文本
  4. 如果失败,文件本身就出了问题

如果文件由字节0x09(制表符),0x0A(换行符),0x0C(换页),0x0D(回车符)或0x20到0x7E组成,那么它可能是ASCII文本。

如果文件包含除上述三个之外的任何其他ASCII控制字符,0x00到0x1F,那么它可能是二进制数据。

对于具有高阶位的任何字节,UTF-8文本遵循非常特定的模式,但是像ISO-8859-1这样的固定长度编码则不然。 UTF-16可以经常包含空字节(0x00),但只能包含其他所有位置。

对于其他任何事情你都需要一个较弱的启发式算法。


没有保证的方法,但这里有几种可能性:

1)在文件上查找标题。 遗憾的是,标题是特定于文件的,因此虽然您可能会发现它是一个RAR文件,但您无法获得更为通用的答案,无论是文本还是二进制文件。

2)计算字符与非字符类型的数量。 文本文件主要是字母字符,而二进制文件 - 尤其是rar,zip等压缩文件 - 往往会更均匀地表示字节。

3)寻找定期重复的换行模式。


看看JMimeMagic库。

jMimeMagic是一个用于确定文件或流的MIME类型的Java库。


运行file -bi {filename} 。 如果返回的内容以'text /'开头,那么它是非二进制的,否则就是。 ;-)





binary