记一次InputStream引起的乱码
项目上线一周后,正准备看新闻的我突然接到了一个任务。线上突然出现了一条乱码的数据,需要解决这个bug。于是我放下了手中的保温杯,开始解决这个bug。经过一番折腾,发现是有一个同事在处理IO流上写得有点问题,导致了乱码的产生。
一、问题的发现与分析
(1)发现
- [1] 数据库表里面字符集设置错误
- [2] 由于未加编码过滤器导致SpringMVC接收参数时造成的乱码
- [3] 代码中涉及byte数组转换String时出现了问题

/**
* 将流中的内容转换为字符串,主要用于提取request请求的中requestBody
* @param in
* @param encoding
* @return
*/
public static String streamToString(InputStream in, String encoding){
// 将流转换为字符串
try {
StringBuffer sb = new StringBuffer();
byte[] b = new byte[1024];
for (int n; (n = in.read(b)) != -1;) {
sb.append(new String(b, 0, n, encoding));
}
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("提取 requestBody 异常", e);
}
}
/**
* 将流中的内容转换为字符串,主要用于提取request请求的中requestBody
* @param in
* @param encoding
* @return
*/
public static String streamToString(InputStream in, String encoding){
// 将流转换为字符串
try {
StringBuffer sb = new StringBuffer();
byte[] b = new byte[1024];
for (int n; (n = in.read(b)) != -1;) {
sb.append(new String(b, 0, n, encoding));
}
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("提取 requestBody 异常", e);
}
}
(2)分析
二、问题的解决
/**
* 将流中的内容转换为字符串,主要用于提取request请求的中requestBody
* @param in
* @param encoding
* @return
*/
public static String streamToString(InputStream in, String encoding){
// 将流转换为字符串
ByteArrayOutputStream bos = null;
try {
// 1.创建内存输出流,将读到的数据写到内存输出流中
bos = new ByteArrayOutputStream();
// 2.创建字节数组
byte[] arr = new byte[1024];
int len;
while(-1 != (len = in.read(arr))) {
bos.write(arr, 0, len);
}
// 3.将内存输出流的数据全部转换为字符串
return bos.toString(encoding);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("提取 requestBody 异常", e);
} finally {
if(null != bos) {
try {
// 其实这个内存输出流可关可不关,因为它的close方法里面没做任何操作。
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 将流中的内容转换为字符串,主要用于提取request请求的中requestBody
* @param in
* @param encoding
* @return
*/
public static String streamToString(InputStream in, String encoding){
// 将流转换为字符串
ByteArrayOutputStream bos = null;
try {
// 1.创建内存输出流,将读到的数据写到内存输出流中
bos = new ByteArrayOutputStream();
// 2.创建字节数组
byte[] arr = new byte[1024];
int len;
while(-1 != (len = in.read(arr))) {
bos.write(arr, 0, len);
}
// 3.将内存输出流的数据全部转换为字符串
return bos.toString(encoding);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("提取 requestBody 异常", e);
} finally {
if(null != bos) {
try {
// 其实这个内存输出流可关可不关,因为它的close方法里面没做任何操作。
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
三、小结
记一次InputStream引起的乱码的更多相关文章
- InputStream 读取中文乱码 扩展
对于InputStream读取中文乱码,下面这段话给出了很好的解释,以及后续编码上的扩展. BufferedInputStream和BufferedOutputStream是过滤流,需要使用已存在的节 ...
- C# InputStream获取后乱码处理
Post推送过来的数据流获取后部分中文出现乱码,晚上找了好多办法,不如朋友鼎力相助,哈哈哈~不说废话了上代码把 旧代码基本是网上普遍写法,字段不长用起来不会有乱码情况,但是传送字段一旦过长,超过byt ...
- Android InputStream接收 字符串乱码 问题
各个国家和地区所制定的不同 ANSI 编码标准中,都只规定了各自语言所需的“字符”.比如:汉字标准(GB2312)中没有规定韩国语字符怎样存储.这些 ANSI 编码标准所规定的内容包含两层含义:1. ...
- 记一次IntelliJ IDEA中文乱码问题
问题描述:输出控制台中文乱码,反正就是各种百度解决不了 问题解决:https://blog.csdn.net/m0_37893932/article/details/78280663 解决方案:我用的 ...
- 记一次Win上MySQL乱码问题
Win上MySQL乱码问题 笔记本上的数据库总会时不时的乱码(或者是一直乱码我没注意到?),在谷歌上试了几次错才正确解决,在此记录一下. 在MySQL数据库存储目录找到my.ini,在相应的标签下分别 ...
- 记一次idea后台日志乱码解决办法
- javaSE高级篇2 — 流技术 — 更新完毕
1.先认识一个类----File类 前言:IO相关的一些常识 I / O----输入输出 I 输入 input 0 输出 output I / o 按数据的流动方向来分- ...
- JavaFX+SpringBoot+验证码功能的小型薪酬管理系统
2020.07.22更新 1 概述 1.1 简介 一个简单的小型薪酬管理系统,前端JavaFX+后端Spring Boot,功能倒没多少,主要精力放在了UI和前端的一些逻辑上面,后端其实做得很简单. ...
- java web 学习十(HttpServletRequest对象1)
一.HttpServletRequest介绍 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象 ...
随机推荐
- JVM虚拟机学习一:垃圾回收算法总结
1.java虚拟机中涉及到的数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型. 基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某 ...
- Android广播机制的基本使用
一提到广播我们第一感觉就会联想到小时候村里面的广播,安卓的广播机制也是类似于大喇叭.有发送广播的地方,也有接收广播的地方.但是具体怎么操作呢,我们来一步一步的看下去~ 安卓的广播种类 系统发送的广播: ...
- Spring MVC 全注解配置 (十一)
完整的项目案例: springmvc.zip 目录 实例 项目结构: 父级的pom配置: <?xml version="1.0" encoding="UTF-8&q ...
- python第一百零八天---Django 3 session 操作
上节内容回顾: 1.请求周期 url> 路由 > 函数或类 > 返回字符串或者模板语言? Form表单提交: 提交 -> url > 函数或类中的方法 - .... Ht ...
- gif软件(ShareX)
介绍 官网:https://getsharex.com/ 开源,免费的一款软件,录制GIF功能简单,按下快捷键,选取指定的区域即可进行录制,录制完成后的文件默认存放在个人文件夹,整个过程几乎几打断你的 ...
- Win10安装sqlserver2014打开显示黑色界面,mardown打开显示报错
问题描述: 我电脑从win7更新到win10以后就打开sqlserver2014显示黑色背景有问题,卸载了又装都是没有用 然后我又发现mardown也是有问题打开报告什么错误,忘记截图了,去网上找了个 ...
- C# -- 使用System.Environment获取电脑的相关属性
使用System.Environment获取电脑的相关属性 1.使用System.Environment获取电脑的相关属性(入门案例) static void Main(string[] args) ...
- 简单的bfs
这里主要是写的一个简单的bfs,实例运行了RMAT10无向图,总共有1024个顶点.这种简单的bfs算法存在很明显的缺陷,那就是如果图数据过大,那么进程将会直接被系统杀死. 代码如下: #includ ...
- LeetCode算法题-Maximum Depth of Binary Tree
这是悦乐书的第164次更新,第166篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第23题(顺位题号是104).给定二叉树,找到它的最大深度.最大深度是从根节点到最远叶节 ...
- 【工具大道】UML的点点滴滴
本文地址 点击关注微信公众号 wenyuqinghuai 分享提纲: 1. 概述 2. UML类图 3. UML时序图 4. 参考资料 1.概述 1.1)百度百科: 又称统 ...