如何检查文件是否是纯文本?

时间:2011-07-02 19:28:37

标签: java text binary-data

在我的程序中,用户可以加载带链接的文件(它是一个webcrawler),但是我需要验证用户选择的文件是纯文本还是其他东西(只允许使用纯文本)。

可以这样做吗?如果有用,我正在使用JFileChooser打开文件。

编辑:

对用户的期望:包含网址的文本文件。

我想避免的内容:用户从MS Word加载MP3文件或文档(示例)。

6 个答案:

答案 0 :(得分:5)

文件只是一系列字节,没有进一步的信息,你无法判断这些字节是否应该是某些字符串编码中的代码点(比如ASCII或UTF-8或ANSI-something)或其他东西。您将不得不求助于启发式,例如:

  • 尝试使用多种已知编码解析文件,并查看解析是否成功。如果是的话,你很可能有一个文本文件。
  • 如果您希望仅使用西方语言的文本文件,您可以假设大多数字符位于ASCII范围(0..127),更具体地说,(33..127)加上空格(制表符,换行符,格式)回归,空间)。计算每个不同字节值的出现次数,如果文档的压倒性部分位于“典型的西方字符”集中,则通常可以安全地假设它是文本文件。
  • 扩展以前的方法;以您期望的语言对足够大量的文本进行采样,并构建字符频率配置文件。要检查文件,请将文件的字符频率配置文件与测试数据进行比较,看它是否足够接近。

但这是另一种解决方案:只需将您收到的所有内容视为文本,在需要时应用必要的转换(例如,在发送到Web浏览器时进行HTML编码)。只要您阻止将文件解释为二进制数据(例如用户双击该文件),您将产生的最糟糕的数据就是乱码数据。

答案 1 :(得分:2)

文本也是二进制数据的一种形式。

我想你要检查的是输入中是否有任何字符< 32.如果您可以安全地假设您的文本是多字节编码的,那么您可以扫描整个文件并在中断[0,32]范围内的字节时中止(不包括9,10,13等)否则你可能除了“文本” - 或最坏情况检查空字节[谢谢,tdammers!])。如果您可以合理地期望接收UTF-16或UTF-32编码文本,则必须更加努力。

答案 2 :(得分:1)

如果你不想按file extension猜测,你可以阅读文件的第一部分。但下一个问题将是字符编码。使用BufferedInputStreammark()之前和reset()之后),使用InputStreamReader包含编码"ISO-8859-1"并使用Character.isLetterOrDigit()计算读取的字符或Character.isWhitespace()获取典型文字内容的比例。我认为文本文件的比例应该超过80%。

你也可以尝试其他编码,如UTF-8,但如果它不是UTF-8,你可能会遇到无效字符的问题。

答案 3 :(得分:1)

您还可以检查初始字节是否为BoM,它应指示UTF文件:

- UTF-8     => 0xEF, 0xBB, 0xBF
- UTF-16 BE => 0xFE, 0xFF
- UTF-16 LE => 0xFF, 0xFE

Rossum的

答案 4 :(得分:0)

您应该创建一个查看文件描述的过滤器,并检查文本。

答案 5 :(得分:0)

您可以从Java调用shell命令file -i ${filename},并检查输出以查看它是否包含charset=binary之类的内容。如果是,那么它是二进制文件。否则它是基于文本的文件。

您可以在shell中使用file在各种文件上进行操作并熟悉它。在groovy中,我会写类似

的内容

'file -i ${path/to/myfile}'.execute().getText().contains('charset=binary')

在Java中,您也可以调用shell命令。请参阅this