问题:

使用字节流读取文本文件时,会将一个汉字劈成两半,一次只能读一半出来,产生了乱码,无法使用。就算是一次读取2个字节出来,也依然不能解决问题。

如何解决乱码问题,读出完整的汉字和中英文混杂的整篇文章呢?

  1. char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。所有字符均以2个字节存储。
  2. 这个方法使用一个byte的数组作为一个缓冲区,每次从数据源中读取和缓冲区大小(二进制位)相同的数据并将其存在缓冲区中。当然byte数组中存放的仍然是0-255的整数,将二进制转换为十进制这个过程仍然是read方法实现的。
  3. 当然byte数组中存放的仍然是0-255的整数,将二进制转换为十进制这个过程仍然是read方法实现的。
  4. 需要注意的是,虽然我们可以指定缓冲区的大小,但是read方法在读取数据的时候仍然是按照字节来读取的。在utf-8等变长编码中,一个复杂字符(比如汉字)所占字节往往大于1,并且长度往往是不固定的。(参照UTF-8编码规则)按照字节读取数据会将字符割裂,这就导致我们在使用read(byte[] b)方法读取文件时,虽然指定了缓冲区的大小,但是仍然会出现乱码。

解决办法 :先读一个字节出来,判断是否是双字节字符(如汉字)的一半,如果是,就再读一个字节进来。然后,将两次读取的内容组装在一起,就是一个完整的汉字了。就算是有多字节的,未来也是可以照此思路解决的。

关键代码 如下:

byte [] bytes1=new byte[1]; //创建英文数组,准备接收字符串,存放1个字节

byte [] bytes2=new byte[2]; //处理中文,准备接收字符串,存放2个字节(双字节)

if (fis.available()!=-1){ //如果多次读取,要用while,此处从简

int size=0;
                    int j= 0; //第几次读取

while ((size = fis.read(bytes1))!=-1){
                        j++; //读取次数
                        sBytes = new String(bytes1);    
                        //如果读取到的bytes[0]<0,说明是中文的半个字符,则再读取一个字节进来
                        if (bytes1[0]<0){
                            bytes2[0]=bytes1[0];
                            fis.read(bytes1);
                            bytes2[1]= bytes1[0];
                            sBytes = new String(bytes2);//重新组装                                
                        }
                        sAll=sAll + sBytes;    // sAll:文件的总内容
                        System.out.println("第"+j+ "次,内容sBytes:"+ sBytes+ "\t"+ "size:"
                                        + size+ "\t"+ bytes1[0]);  // (char)bytes[0]
                    }

使用字节流读取文本文件时,乱码问题的产生与解决相关推荐

  1. EXE4J   解决生成文件时或者读取文件时乱码

    EXE4J   解决生成.文件时或者读取文件时乱码问题一定要添加:VM Parameters:-Dfile.encoding=utf-8 下载链接:https://download.csdn.net/ ...

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

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

  3. java 文件读取 进度_读取文本文件时如何使用Java进度栏?

    我是java swing的新手,我想阅读文本文件.在读取该文件时,我想在java进度栏中显示已读行的百分比.欢迎任何示例代码.我试过了,但我不知道我的逻辑是否正确.我怎样才能做到这一点. import ...

  4. 读取文本文件时 U+FEFF 导致的奇怪问题

    https://www.cnblogs.com/jessezeng/p/6729690.html 项目中经常会从一些文本文件中读取数据进行业务处理,最近遇到一个问题,另外一个部门提供一个txt文本给我 ...

  5. cookie读取中文时乱码

    先写入一个cookie: public static void SetCookie(string name, string value, int day) { name = Encrypt(name, ...

  6. 计算机硬盘磁道损坏有什么症状,计算机硬盘扇区损坏,读取数据时出现死机现象的解决方法...

    长时间使用计算机硬盘时,许多用户遇到了坏扇区,这将大大降低硬盘的使用寿命. 读取坏扇区数据时,在严重的情况下会冻结甚至崩溃. 如果计算机的硬盘上有坏道,则必须修复逻辑坏道. 如何修复计算机硬盘上的坏道 ...

  7. 使用字节流读取中文的问题

    当使用字节流读取文本文件时,可能会有一个小问题.就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储.所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文 ...

  8. python读取txt数据-python读取文本文件数据

    本文要点刚要: (一)读文本文件格式的数据函数:read_csv,read_table 1.读不同分隔符的文本文件,用参数sep 2.读无字段名(表头)的文本文件 ,用参数names 3.为文本文件制 ...

  9. python读取txt文件第一行-python读取文本文件数据

    本文要点刚要: (一)读文本文件格式的数据函数:read_csv,read_table 1.读不同分隔符的文本文件,用参数sep 2.读无字段名(表头)的文本文件 ,用参数names 3.为文本文件制 ...

最新文章

  1. PostgreSQL 电商业务(任意维度商品圈选应用) - json包range数组的命中优化 - 展开+索引优化...
  2. 实验三 编程、编译、连接、跟踪
  3. 百度无人驾驶出租长沙开测:Apollo技术一汽红旗车队,年内服役
  4. java代码,继承。。。主要是传值,赋值。
  5. C# 如何跨平台调用C++的函数指针!
  6. sql server 2008新特性:资源调控器
  7. 如何在 Mac 中对文档进行签名?
  8. 【Low版】HAUT - OJ - Contest1035 - 2017届新生周赛(六)题解
  9. msu文件无法运行_如何打开msu文件
  10. python深度学习——案例讲解
  11. 【ArcGIS Server】切片时C盘空间不足(本地缓存目录空间不足)
  12. 计算机桌面图标怎么变形了,教您电脑桌面图标变大了怎么办
  13. 第一行代码-第二版(郭霖著)笔记十(Service)
  14. C/C++实现水果忍者(四) 实现按鼠标左键划过水果消失的功能
  15. at命令不生效 linux_linux中at命令详解
  16. Ubuntu 安装 postgresql12
  17. Flutter For App——一个简单的豆瓣APP
  18. ENVI5.3 安装教程,新手入门(超详细)附安装包和常见问题
  19. 为什么Microsoft账号登录显示暂时停用你的账户_Apple ID 被锁定或停用怎么办?
  20. 机械革命计算机配置,单品:机械革命X6Ti-S_机械革命笔记本电脑_笔记本评测-中关村在线...

热门文章

  1. linux mutt dns,使用mutt处理电子邮件
  2. XlsxWriter 学习
  3. Java的一些基础知识
  4. 《Linux驱动:设备节点文件的创建过程》
  5. pytorch实现resnet50(训练+测试+模型转换)
  6. 火狐安装低版本hackbar插件
  7. 灵活用工与灵活就业的区别
  8. 话里话外:流程落地切忌眉毛胡子一把抓(一)
  9. CSS回流(Reflow)与重绘(Repaint)
  10. 死磕数据库系列(二十):MySQL 数据库 DDL、DML、DQL、DCL 语言理论与实践(sql 8.0 版)...