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

