一、问题的发生

当我们尝试用字节流处理读取文档时候

public static void main(String[] args) throws IOException {FileInputStream fis=null;try {// File file = new File("d:/hello/1.png");File file = new File("d:/hello/demo.txt");fis = new FileInputStream(file);byte[] b = new byte[5];int len;StringBuffer str = new StringBuffer();while ((len = fis.read(b)) != -1) {str.append(new String(b, 0, len));}System.out.println(str.toString());} catch (IOException e) {e.printStackTrace();} finally {if(fis!=null){fis.close();}}}

运行结果是如下图左侧  读取的文本如下图右侧

          

为啥结果是中文 "我" 和 "长 "没有乱码,其它位置上的乱码了?其实这个跟每次去读的byte数组大小有关

二、究其原因

上面的代码fis.read(b)每次读取5个字节,但在UTF-8编码格式下,每个汉字占3个字节(GBK下是2个),那么问题的发生就显而易见了,

使用字节流读取UTF-8编码的数据乱码的原因分析:当采用UTF-8编码时,如果固定了每次转换的字节数,那么各种类型的字符混用时有很大可能造成乱码。比如每次读取2个字节。 如果存的是"AB",那么OK,不会乱码如果存的是"A文",那么每次读取2个字节,A-->可以读出来A,但是“文”没有读取完整,只读了一个字节的信息,还有2个字节的信息没有读取。所以“文”就会出现乱码

三、如何解决

方法一:如果一定要byte[]数组来存在读取的数据,且数据量较小。那么可以扩大数组的容量,让byte[]数组能够存储所有的字节,然后在转换成字符

// 已知。数据约小于5kb,那么可以把byte数组大小定义成5KB,byte[] bytes = new byte[1024*5];

把所有的数据全部读进去,然后转换成字符,那么不会出现乱码

方法二:使用IO流中的字符流来包装字节流,最便利的就是使用BufferedReader来实现

InputStream is = connection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));

如何避免字节流读取文本乱码相关推荐

  1. java中用字节流读取文本时中文乱码

    字节流可以读取任何文件,视频流:音频流都可以: 字符流只能读取字符: 说明:一般的汉字是2个字节,而英语字母是1个字节,如果用字节流读取中文,一个字节一个字节的输出,容易把中文汉字截断,建议用字符流读 ...

  2. 读取文本出现 锘 * 系列乱码错误(UTF-8 BOM问题)的原因及解决方法

    现象 读取文本时经常会出现锘*系列错误. 例1:锘縣,其实开头的文本是h,http被显示为锘縣ttp 例2:锘缝,其实开头的文本是p,public被显示为锘缝ulic 只要文本的首字母为锘的都属于这类 ...

  3. 使用字节流读取文本文件时,乱码问题的产生与解决

    问题: 使用字节流读取文本文件时,会将一个汉字劈成两半,一次只能读一半出来,产生了乱码,无法使用.就算是一次读取2个字节出来,也依然不能解决问题. 如何解决乱码问题,读出完整的汉字和中英文混杂的整篇文 ...

  4. Java文件读取 中文乱码

    1 字节流以及编码转换说明 String str = "中"; byte[] b_gbk =str.getBytes("GBK"); byte[] b_utf8 ...

  5. java字节流读取文件_字节流读取文件 java的几种IO流读取文件方式

    java字节流怎么读取数据 字节流读取数据例子如下: import java.io.File;import java.io.FileInputStream;import java.io.FileNot ...

  6. bufferedreader读取中文乱码_python字符乱码的解决小结

    引言 无论学习什么程序语言,字符串这种数据类型总是着有非常重要.然而最近在学习python这门语言,想要显示中文,总是出现各种乱码.于是在网上查了很多资料,各说纷纭,我也尝试了许多的方法,有时候可以正 ...

  7. C#中的文本乱码问题

    文本乱码问题 //提供一种解决C#文本乱码的解决思路 //写入使用: string str; str = this.menu.Text; string fname = Application.Star ...

  8. fopen php 乱码,如何解决php fgets读取文件乱码的问题

    如何解决php fgets读取文件乱码的问题,文件,乱码,简体中文,记事本,页面 如何解决php fgets读取文件乱码的问题 易采站长站,站长之家为您整理了如何解决php fgets读取文件乱码的问 ...

  9. java中使用字符(字节)读取文本内容

    package test;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.Fi ...

  10. python读取文件乱码问题

    今天突然想做一个实时读取 日志文件的程序,然后用Python爬虫直接爬取文件,用只读的方式打开避免对 系统 写入日志 造成影响. 上代码: #! /usr/bin/env python # codin ...

最新文章

  1. 两难!到底用Apache BeanUtils还是Spring BeanUtils?
  2. python爬虫资源大全_Python爬虫抓取纯静态网站及其资源(基础篇)
  3. (回溯 UVa129)困难的串
  4. SHLVL 和 BASH_SUBSHELL 两个变量的区别
  5. python求解线性规划问题
  6. 卡巴斯基的离线更新以及病毒库备份
  7. IAR8.4.2安装方法
  8. 吴声年度演讲全文:场景品牌,新商业的此时此刻
  9. java 批量发送邮件,java利用网易邮箱批量发送邮件(带附件)
  10. 运用贝塞尔曲线绘制笔锋效果
  11. log4cxx linux 使用,log4cxx在Linux下的编译使用
  12. CSS实现当鼠标移入或者移出时实现动画过渡效果
  13. 微信小程序设置解锁密码
  14. 【转】【青春励志】当幸福来敲门——我的考研故事
  15. 如何建立Multi-Step(多步预测)的LSTM时间序列模型(以对家庭用电预测为例)
  16. 刚安装的PostgreSQL默认用户名和密码是多少?
  17. 小程序----页面样式(WXSS)
  18. 显示手机键盘的回车换行
  19. 【网络工程师配置篇】——OSPF基础配置!
  20. 4-VIV-Android之PopupWindow

热门文章

  1. 2011QQ搞笑个性签名:小弟不才,大名耶稣.小名上帝.法号如来
  2. python查询12306余票_python命令行查询12306火车票
  3. 故宫景点功课10:后三宫区(中)
  4. MER 音乐情感识别-论文笔记7
  5. 水星路由器 Mercury MER1200G刷机教程(不需要编程器)
  6. linux syslinux u盘,如何使用syslinux做一个开启U盘?
  7. credit author statement
  8. WinCC RT Adv 项目下载与自动运行
  9. 计算机启动硬盘自检,启动时硬盘自检?这样处理就没事了
  10. 2019杭电多校 Snowy Smile hdu6638 (线段树最大子段和)