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
相关产品推荐
相关产品推荐

