java.net.URLConnection.guessContentTypeFromStream 和 text/plain

标签 java text mime-types urlconnection

全部,

我正在尝试识别具有 Mac 行结尾的纯文本文件,并在 InputStream 中静默将它们转换为 Windows 或 Linux 行结尾(重要的部分是 LF 字符,真的)。具体来说,我正在使用几个 API,这些 API 采用 InputStreams 并且被硬锁定为寻找\n 作为换行符。

有时,我会得到二进制文件。显然,一个不是文本类的文件不应该进行这种替换,因为恰好对应于\r 的值显然不能在不严重破坏的情况下默默地跟在\n 之后。

我正在尝试使用 java.net.URLConnection.guessContentTypeFromStream 并且仅在类型为文本/纯文本时执行行尾转换。不幸的是,"text/plain" 似乎不在其返回值范围内;对于我的平面文本文件,我得到的只是 null,假设所有无法识别的文件都可以被修改可能是不安全的。

我可以使用什么更好的库(最好是在公共(public) Maven 存储库和开源库中)来执行此操作?或者,如何让 guessContentTypeFromStream 为我工作?我知道我在描述一个本质上危险的应用程序,没有完美的解决方案,但我是否应该将“null”视为可能是“text/plain”,我只需要自己编写更多代码来寻找证据证明它不是't?

最佳答案

在我看来,您的要求是确定文件是否为文本文件。鉴于此,有一个解决方案 here这似乎是对的:

当然,他说的是 unix、bash 和 perl,但概念是一样的:

Unless you inspect every byte of the file, you are not going to get this 100%. And there is a big performance hit with inspecting every byte. But after some experiments, I settled on an algorithm that works for me. I examine the first line and declare the file to be binary if I encounter even one non-text byte. It seems a little slack, I know, but I seem to get away with it.

编辑#1:
扩展这种类型的解决方案,似乎一种合理的方法是确保文件不包含非 ascii 字符(除非您处理的是非英语文件……这是另一种解决方案)。这可以通过检查作为字符串的文件内容是否与此不匹配来完成:

// -- uses commons-io
String fileAsString = FileUtils.readFileToString( new File( "file-name-here" ) );
boolean isTextualFile = fileAsString.matches( ".*\\p{ASCII}+.*" );

编辑#2
你可能想试试这个作为你的正则表达式,或者类似的东西。不过,我承认它可能需要一些改进。

".*(?:\\p{Print}|\\p{Space})+.*"

关于java.net.URLConnection.guessContentTypeFromStream 和 text/plain,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4443897/

相关文章:

java - 基于 Spring-MVC 注解的 bean 验证是否支持基于集合的属性? ( Spring -MVC)

java - (Rest Api)回收器 View ,在android中的每行中带有接受和拒绝请求按钮

python - 如何从类文件对象中使用 python mimetypes.guess_type

coldfusion - 在 Coldfusion 中检测已上传到服务器上的文件 mimetype

java - 在 java/c++/c/actionscript-3 应用程序中使用静态变量的最佳方法是什么?

java - Spring Integration FTP 使用后删除本地文件(Spring Boot)

flutter - 如何在 flutter 中为文本添加阴影?

c - C 中的单词回文

mysql - 将消息存储为 BLOB(二进制大对象)还是普通文本?

api - URL 查询参数或媒体类型参数(在 Accept header 中)来配置对 HTTP 请求的响应?