全包字符集以避免“java.nio.charset.malformedInputException: Input length = 1”?

2022-08-31 09:16:39

我正在Java中创建一个简单的字数程序,该程序可以读取目录的基于文本的文件。

但是,我不断收到错误:

java.nio.charset.MalformedInputException: Input length = 1

从这行代码:

BufferedReader reader = Files.newBufferedReader(file,Charset.forName("UTF-8"));

我知道我可能得到了这个,因为我使用了一个不包含文本文件中某些字符的字符,其中一些包含其他语言的字符。但我想包括这些角色。Charset

我后来在JavaDocs上了解到它是可选的,仅用于更有效地读取文件,所以我将代码更改为:Charset

BufferedReader reader = Files.newBufferedReader(file);

但有些文件仍然会抛出 .我不知道为什么。MalformedInputException

我想知道是否有一个包罗万象的字符集,可以让我阅读具有许多不同类型字符的文本文件

谢谢。


答案 1

您可能希望获得受支持的编码列表。对于每个文件,依次尝试每种编码,可能从 UTF-8 开始。每次捕获 时,请尝试下一次编码。MalformedInputException


答案 2

从文件创建 BufferedReader。newBufferedReader

Files.newBufferedReader(Paths.get("a.txt"), StandardCharsets.UTF_8);

运行应用程序时,可能会引发以下异常:

java.nio.charset.MalformedInputException: Input length = 1

new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"),"utf-8"));

效果很好。

不同之处在于,前者使用CharsetDecoder默认操作。

格式错误的输入和不可映射的字符错误的默认操作是报告它们。

而后者使用 REPLACE 操作。

cs.newDecoder().onMalformedInput(CodingErrorAction.REPLACE).onUnmappableCharacter(CodingErrorAction.REPLACE)

推荐