You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java读取文件报java.nio.charset.MalformedInputException: Input length = 1如何解决

异常触发原因

该java.nio.charset.MalformedInputException: Input length = 1异常由编码不匹配或读取了非文本文件导致:
你调用的无参重载方法Files.readAllLines(Path path)默认使用UTF-8编码解析文件内容,当待读取文件不符合UTF-8编码规则(比如文件是GBK、ISO-8859-1等其他编码,或者文件本身是图片、编译产物等二进制非文本文件)时,UTF-8解码器遇到不符合规则的字节序列就会抛出该异常。从栈追踪也可以明确看到,异常正是在Files.readAllLines调用过程中触发的。
另外你当前使用Files.list遍历目录时没有做过滤,会将目录下的子目录、二进制文件、隐藏系统文件等全部纳入读取范围,也是触发该异常的高频原因。

解决方案
  • 第一步先过滤非目标文件:遍历路径时增加过滤逻辑,仅处理符合预期的文本文件,避免读取二进制文件或子目录:
filesPaths = Files.list(Paths.get(directory))
        // 仅处理普通文件,过滤子目录
        .filter(Files::isRegularFile)
        // 按需调整允许的文本文件后缀
        .filter(path -> path.getFileName().toString().endsWith(".txt"));
  • 第二步指定正确的文件编码,或使用容错编码策略:
    如果明确知道文件的编码格式,直接在readAllLines中传入对应编码即可,比如文件为GBK编码时:
Files.readAllLines(filePath, Charset.forName("GBK"))

如果不确定文件编码,或需要兼容不规范的字节内容,可以配置编码错误处理规则,自动忽略不可解析的字符:

// 构造UTF-8解码器,忽略编码错误的字节
CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder()
        .onMalformedInput(CodingErrorAction.IGNORE)
        .onUnmappableCharacter(CodingErrorAction.IGNORE);
// 用自定义解码器读取文件
try (BufferedReader br = Files.newBufferedReader(filePath, decoder)) {
    List<String> lines = br.lines().collect(Collectors.toList());
    // 后续的文本拆分逻辑不变
}
  • 额外注意:如果是读取Jar包内的resources目录文件,不要直接用Paths.get读取路径,打包后会找不到文件,建议改用类加载器的getResourceAsStream方法读取资源流。

内容的提问来源于stack exchange,提问作者rasilvap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 05:24:02