月度归档:2015年06月

Scala or Java NIO 如何读取包含多种编码格式文件?

如果一个文件中包含多种编码,而某个字符的编码在另外一种编码中,又不存在,那么当读取文件时,就会出错。

比如常见的:java.nio.charset.MalformedInputException: Input length = 1

那么实际中,使用 nio 读文件时,一般是可以提供一个 encoder 的,类型是 java.nio.charset.CharsetEncoder,在使用 encoder encode 的过程中,可能出现两种错误:
1. Malformed Input 错误的输入
2. Unmappable Character 无法 mapping 到的字符
针对这两种情况,我们可以单独设置 java.nio.charset.CodingErrorAction,CodingErrorAction 有三种:IGNORE, REPLACE 和 REPORT

在 scala 中可以在 Source 读文件前,提供一个 codec

implicit val codec = Codec(“UTF-8”)
codec.onMalformedInput(CodingErrorAction.REPLACE)
codec.onUnmappableCharacter(CodingErrorAction.REPLACE)

就能够解决多重编码文件带来的问题了。

Java 中需要针对不同的读取接口,来传入 encoder 即可