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

为何StringBuilder的append方法会抛出MalformedInputException异常?

解决读取文件到StringBuilder时的MalformedInputException错误

嘿,这个问题我之前也碰到过!你遇到的java.nio.charset.MalformedInputException本质是文件编码和读取时使用的编码不匹配导致的——Files.lines()方法默认会用UTF-8编码读取文件,但如果你的JSON文件是其他编码(比如GBK、ISO-8859-1、Windows-1252这类),就会因为无法解析某些字节而抛出这个异常。

下面给你几个可行的解决方案:

1. 指定正确编码读取文件(推荐用try-with-resources)

先确定你的JSON文件实际编码(比如用Notepad++打开看右下角的编码标识),然后在读取时明确指定这个编码,同时用try-with-resources语法自动关闭流,避免资源泄漏:

Path path = Paths.get(dir.getAbsolutePath(), file.getName()); // 用多参数写法更优雅,不用拼接File.separator
StringBuilder data = new StringBuilder();

// 把"GBK"替换成你文件实际的编码,比如"ISO-8859-1"或"UTF-16"
try (Stream<String> lines = Files.lines(path, Charset.forName("GBK"))) {
    lines.forEach(line -> data.append(line).append(System.lineSeparator()));
} catch (IOException e) {
    e.printStackTrace();
}

2. 直接读取字节再转成字符串

如果逐行读取有换行符兼容问题,也可以直接读取文件所有字节,再用指定编码转成字符串:

Path path = Paths.get(dir.getAbsolutePath(), file.getName());
try {
    byte[] fileBytes = Files.readAllBytes(path);
    // 同样替换为文件实际编码
    String content = new String(fileBytes, Charset.forName("GBK"));
    StringBuilder data = new StringBuilder(content);
    // 后续验证JSON的逻辑...
} catch (IOException e) {
    e.printStackTrace();
}

小提示

  • 不确定文件编码的话,可以先试试系统默认编码Charset.defaultCharset(),但这个依赖于运行环境,跨平台场景不推荐;
  • 处理完文件流一定要记得关闭,try-with-resources是最省心的写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:02:29