使用字节流读取文本文件时,乱码问题的产生与解决
问题:
使用字节流读取文本文件时,会将一个汉字劈成两半,一次只能读一半出来,产生了乱码,无法使用。就算是一次读取2个字节出来,也依然不能解决问题。
如何解决乱码问题,读出完整的汉字和中英文混杂的整篇文章呢?
- char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦。所有字符均以2个字节存储。
- 这个方法使用一个byte的数组作为一个缓冲区,每次从数据源中读取和缓冲区大小(二进制位)相同的数据并将其存在缓冲区中。当然byte数组中存放的仍然是0-255的整数,将二进制转换为十进制这个过程仍然是read方法实现的。
- 当然byte数组中存放的仍然是0-255的整数,将二进制转换为十进制这个过程仍然是read方法实现的。
- 需要注意的是,虽然我们可以指定缓冲区的大小,但是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]
}
使用字节流读取文本文件时,乱码问题的产生与解决相关推荐
- EXE4J 解决生成文件时或者读取文件时乱码
EXE4J 解决生成.文件时或者读取文件时乱码问题一定要添加:VM Parameters:-Dfile.encoding=utf-8 下载链接:https://download.csdn.net/ ...
- java中用字节流读取文本时中文乱码
字节流可以读取任何文件,视频流:音频流都可以: 字符流只能读取字符: 说明:一般的汉字是2个字节,而英语字母是1个字节,如果用字节流读取中文,一个字节一个字节的输出,容易把中文汉字截断,建议用字符流读 ...
- java 文件读取 进度_读取文本文件时如何使用Java进度栏?
我是java swing的新手,我想阅读文本文件.在读取该文件时,我想在java进度栏中显示已读行的百分比.欢迎任何示例代码.我试过了,但我不知道我的逻辑是否正确.我怎样才能做到这一点. import ...
- 读取文本文件时 U+FEFF 导致的奇怪问题
https://www.cnblogs.com/jessezeng/p/6729690.html 项目中经常会从一些文本文件中读取数据进行业务处理,最近遇到一个问题,另外一个部门提供一个txt文本给我 ...
- cookie读取中文时乱码
先写入一个cookie: public static void SetCookie(string name, string value, int day) { name = Encrypt(name, ...
- 计算机硬盘磁道损坏有什么症状,计算机硬盘扇区损坏,读取数据时出现死机现象的解决方法...
长时间使用计算机硬盘时,许多用户遇到了坏扇区,这将大大降低硬盘的使用寿命. 读取坏扇区数据时,在严重的情况下会冻结甚至崩溃. 如果计算机的硬盘上有坏道,则必须修复逻辑坏道. 如何修复计算机硬盘上的坏道 ...
- 使用字节流读取中文的问题
当使用字节流读取文本文件时,可能会有一个小问题.就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储.所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文 ...
- python读取txt数据-python读取文本文件数据
本文要点刚要: (一)读文本文件格式的数据函数:read_csv,read_table 1.读不同分隔符的文本文件,用参数sep 2.读无字段名(表头)的文本文件 ,用参数names 3.为文本文件制 ...
- python读取txt文件第一行-python读取文本文件数据
本文要点刚要: (一)读文本文件格式的数据函数:read_csv,read_table 1.读不同分隔符的文本文件,用参数sep 2.读无字段名(表头)的文本文件 ,用参数names 3.为文本文件制 ...
最新文章
- PostgreSQL 电商业务(任意维度商品圈选应用) - json包range数组的命中优化 - 展开+索引优化...
- 实验三 编程、编译、连接、跟踪
- 百度无人驾驶出租长沙开测:Apollo技术一汽红旗车队,年内服役
- java代码,继承。。。主要是传值,赋值。
- C# 如何跨平台调用C++的函数指针!
- sql server 2008新特性:资源调控器
- 如何在 Mac 中对文档进行签名?
- 【Low版】HAUT - OJ - Contest1035 - 2017届新生周赛(六)题解
- msu文件无法运行_如何打开msu文件
- python深度学习——案例讲解
- 【ArcGIS Server】切片时C盘空间不足(本地缓存目录空间不足)
- 计算机桌面图标怎么变形了,教您电脑桌面图标变大了怎么办
- 第一行代码-第二版(郭霖著)笔记十(Service)
- C/C++实现水果忍者(四) 实现按鼠标左键划过水果消失的功能
- at命令不生效 linux_linux中at命令详解
- Ubuntu 安装 postgresql12
- Flutter For App——一个简单的豆瓣APP
- ENVI5.3 安装教程,新手入门(超详细)附安装包和常见问题
- 为什么Microsoft账号登录显示暂时停用你的账户_Apple ID 被锁定或停用怎么办?
- 机械革命计算机配置,单品:机械革命X6Ti-S_机械革命笔记本电脑_笔记本评测-中关村在线...