Spring使用StreamingResolution返回txt下载时出现多余t、w字符的原因及解决方法
问题原因
你错误使用了ObjectOutputStream处理纯文本导出:这个类是Java用于对象序列化的工具,写入的内容是携带序列化协议元数据的二进制格式,而非原生字符串内容。你看到的多余字符t、w以及乱码?,本质是序列化元数据被按照UTF-8解析为文本后的结果。
同时你的代码混用了writeObject和writeUTF两种写入方法,两种方法的序列化头格式不同,进一步加剧了内容异常。
修复方案
直接替换序列化输出流为纯文本字节写入逻辑即可,修复后的参考代码如下:
List<String> dataList = (List<String>) parameters.get("myData"); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // 直接按UTF-8编码写入字符串字节,不需要序列化流 for (String s : dataList) { outputStream.write(s.trim().getBytes(StandardCharsets.UTF_8)); outputStream.write("\n".getBytes(StandardCharsets.UTF_8)); } StreamingResolution streamingResolution = new StreamingResolution("text/plain", new ByteArrayInputStream(outputStream.toByteArray())); streamingResolution.setCharacterEncoding(CharEncoding.UTF_8); String year = Integer.toString(Integer.parseInt(end.substring(0, 4))); String day = year + end.substring(4, 6); outputStream.close(); return streamingResolution.setFilename(day + ".txt");
附带优化了原代码的两处小问题:
- 移除了循环外多余的空行写入逻辑,避免导出文件首行空行
- 修复了
Integer.parseInt外层多余的左括号语法错误
内容的提问来源于stack exchange,提问作者rubedo
相关产品推荐
相关产品推荐

