[英]How to check if a file is plain text?
在我的程序中,用户可以加载带有链接的文件(它是一个网络爬虫),但我需要验证用户选择的文件是纯文本还是其他文件(只允许纯文本)。
是否有可能做到这一点? 如果有用,我正在使用 JFileChooser 打开文件。
编辑:
对用户的期望:包含 URL 的文本文件。
我要避免的:用户从 MS Word 加载 MP3 文件或文档(示例)。
文件只是一系列字节,如果没有更多信息,您无法判断这些字节是否应该是某些字符串编码(例如 ASCII 或 UTF-8 或 ANSI-something)或其他东西的代码点。 您将不得不求助于启发式方法,例如:
但这里有另一个解决方案:只需将您收到的所有内容都视为文本,在需要的地方应用必要的转换(例如,发送到 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.