繁体   English   中英

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

[英]How to check if a file is plain text?

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

是否有可能做到这一点? 如果有用,我正在使用 JFileChooser 打开文件。

编辑:

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

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

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

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

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

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

我想您要检查的是您的输入中是否有任何小于 32 的字符。如果您可以安全地假设您的文本是多字节编码的,那么您可以扫描整个文件并在您点击时中止[0, 32) 范围内的字节(不包括 9、10、13 以及除“文本”之外的任何其他内容 - 或者最坏情况下检查 null 字节 [谢谢,tdammers。]),如果你可以合理地期望接收 UTF-16 或 UTF-32 编码的文本。 你必须更加努力。

如果您不想通过文件扩展名来猜测,您可以阅读文件的第一部分。 但下一个问题将是字符编码。 使用BufferedInputStream (之前的mark()和之后的reset() ),使用编码"ISO-8859-1"InputStreamReader进行包装,并使用Character.isLetterOrDigit()Character.isWhitespace()计算读取的字符以获得比率典型的文本内容。 我认为文本文件的比例应该超过 80%。

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

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

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

罗苏姆

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

您可以在 shell 中的file上玩各种文件并熟悉它。 在 groovy 我会写类似

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

在 Java 中,您还可以调用 shell 命令。 请参考这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM