如何验证文件是否可读



如何确保文件可供人类读取。

通过这种方式,我主要想检查该文件是否是txtymldocjson文件等等

问题是,在我想要执行此检查的情况下,文件扩展名是误导性的,我的意思是纯文本文件(应该是.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

通常情况下,您不能这样做。你可以使用语言识别算法来猜测给定的文本是否是人类可以的文本。然而,由于您的示例包含像html这样的正式语言,因此您遇到了一些深层次的麻烦。如果你真的想实现对(一组有限的)形式语言的检查,你可以使用GLR解析器来解析结合了所有这些语言的(模糊的)语法。然而,这还不能解决语法错误的问题(尽管可以定义启发式)。最后,您需要考虑"人类可读"的实际含义:例如,您是否包括Base64?

编辑:如果你只对字符集感兴趣:请参阅这个问题的答案。基本上,您必须读取文件,并检查内容在您认为可读的任何字符编码中是否有效(utf-8应该涵盖您现实世界中的大多数情况)。

对于某些文件,检查可打印ASCII范围中的字节比例会有所帮助。如果超过75%的字节在最初的几百个字节内,那么它可能是"可读的"。

有些文件有标题,比如UTF文件上的各种形式的BoM,启动MS文档文件的0xA5EC,或者.exe开头的"MZ"签名,它会告诉你文件是否可读。

许多现代文本文件都是UTF格式,通常可以通过读取文件的第一块来识别,即使它们没有BoM。

基本上,您将不得不运行许多不同的文件类型来查看是否匹配。将文件的前千字节加载到内存中,并对其进行许多不同的检查。一旦您有了一些数据,您就可以先排序检查以查找最常见的格式。

相关内容

  • 没有找到相关文章

最新更新