字符编码引起的MalformedInputException
阅读 12
最近,使用Java读取txt文件,出现了一个MalformedInputException。
代码如下:
public static void main(String[] args) throws IOException {
try (var lines = Files.lines(Path.of("resources/Lord.txt"))) {
var iterator = lines.iterator();
while (iterator.hasNext()) {
String line = iterator.next();
if (!line.isBlank()) {
// do something
}
}
}
IO.println("任务完成");
}在代码执行到第5行的iterator.hasNext()处时,提示:
Exception in thread "main" java.io.UncheckedIOException: java.nio.charset.MalformedInputException: Input length = 1原因分析
这个异常的核心原因是 Files.lines() 默认采用 UTF-8 编码读取文件,而目标文件 Lord.txt 的实际编码格式不是 UTF-8(例如 GBK等其他编码)。
在解密字节流为字符时,Java 遇到了无法用 UTF-8 正确识别的字节序列,底层就抛出MalformedInputException,因为Files.lines()属于 Stream 流式读取,所以这个IOException被包装成了UncheckedIOException抛出。
因为这个文件是从我之前的Windows电脑上转过来的, Windows10及更早版本中,中文版Windows系统的默认编码是 GBK。现在(Windows 10/11新版)中,微软已将记事本的默认编码改为了UTF-8。
解决方案
明确了是编码问题,那么问题就好解决了,在Files.lines的第二个参数中指定正确的编码:
var lines = Files.lines(srcPath2, Charset.forName("GBK"))再次运行,就正常了。
最后编辑于: 2026-08-24