如何确保人类可以读取文件。
我基本上想检查文件是txt
,yml
,doc
,json
文件等等。
问题是,在我想要执行此检查的情况下,文件扩展名是误导性的,我的意思是纯文本文件(应该是.txt)的扩展名为.d
和各种其他人: - (
验证人类可以读取文件的最佳方法是什么?
到目前为止,我已尝试过以下扩展程序:
private boolean humansCanRead(String extention) {
switch (extention.toLowerCase()) {
case "txt":
case "doc":
case "json":
case "yml":
case "html":
case "htm":
case "java":
case "docx":
return true;
default:
return false;
}
}
但正如我所说,扩展并不像预期的那样。
编辑:为了澄清,我正在寻找一个平台独立的解决方案,而不使用外部库,并缩小我的意思“人类可读”,我的意思是包含任何语言字符的纯文本文件,我也不要介意文件中的文字是否有意义,如果它是编码的,我真的不在乎这一点。感谢所有回复! :D
答案 0 :(得分:2)
一般来说,你不能这样做。您可以使用language identification algorithm来猜测给定文本是否是人类可以说出的文本。因为你的例子包含像html这样的正式语言,所以你遇到了一些麻烦。如果您真的想要对(一组有限的)正式语言执行检查,可以使用GLR parser来解析组合所有这些语言的(模糊)语法。然而,这还不能解决语法错误的问题(虽然可能有可能定义启发式)。最后,您需要考虑“人类可读”的实际含义:例如你加入Base64吗?
编辑:如果您只对字符集感兴趣:请参阅this questions' answer。基本上,你必须阅读文件并检查内容是否有效,无论你认为哪种字符编码是人类可读的(utf-8应涵盖你的大多数现实案例)。
答案 1 :(得分:1)
对于某些文件,检查可打印ASCII范围内的字节比例会有所帮助。如果超过75%的字节在前几百个字节内的那个范围内,那么它可能是“可读的”。
有些文件有标题,比如UTF文件上各种形式的BoM,0xA5EC用于启动MS doc文件或者#34; MZ" .exe开头的签名,它会告诉你文件是否可读。
许多现代文本文件采用UTF格式之一,通常可以通过读取文件的第一个块来识别,即使它们没有BoM。
基本上,您将不得不运行许多不同的文件类型来查看是否匹配。将文件的第一个千字节加载到内存中并对其运行许多不同的检查。获得一些数据后,您可以先订购检查以查找最常见的格式。