Java字节流乱码问题

雨泽
博客专家认证
2013-02-04 10:38:02
不能用字符流读取文件,需要用字节流读取文件,该文件中含有中文,英文,键盘上的所有字符,在读取的时候,设置的缓冲区是1024,那么就有可能出现一种问题,在读取到1023字节的时候都是英文和数字,刚好一个字符一个字节,这个时候碰到一个汉字,就只读取了汉字的其中一个字节,就出现了乱码.


以下方案不行:
读取到\r\n或者是\n,为什么可能根本就没有换行这个字符写入到文件.

快过年了给个吉利分数数字88,恭祝各位:
新年到、春节到、有成绩、别骄傲、失败过、别死掉、齐努力、开大炮、好运气、天上掉、同分享、大家乐。天天好运道,日日福星照!
...全文
646 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdn_2013 2013-02-04
  • 打赏
  • 举报
回复
引用 楼主 yhc13429826359 的回复:
不能用字符流读取文件,需要用字节流读取文件,该文件中含有中文,英文,键盘上的所有字符,在读取的时候,设置的缓冲区是1024,那么就有可能出现一种问题,在读取到1023字节的时候都是英文和数字,刚好一个字符一个字节,这个时候碰到一个汉字,就只读取了汉字的其中一个字节,就出现了乱码. 以下方案不行: 读取到\r\n或者是\n,为什么可能根本就没有换行这个字符写入到文件. ……
可以增加输出字符的编码格式为utf-8的代码
七神之光 2013-02-04
  • 打赏
  • 举报
回复
加入尾部(汉字字头)识别,然后再用个全局变量记录这个尾部。如果是汉字字头,就加入下一组中。
雨泽 2013-02-04
  • 打赏
  • 举报
回复
第三种方案: RandomAccessFile.getFilePointer() 得到文件指针的位置 RandomAccessFile.seek() 设置文件指针的位置
雨泽 2013-02-04
  • 打赏
  • 举报
回复
引用 8 楼 gongdath 的回复:
我觉得直接用字符读取不就行了吗?难道有只能用字节读取的需求要求?
是想看看如何处理这样的问题,当然可以用字符流,就是想看看这种方式该如何处理, 我有一种方案:(这种目前还没有代码,只是思想) 1.记录指针当前的位置,如果碰到1023个字节都读取完整而1024个字节只读取半个汉字的时候,下次重新读取的时候重置指针的位置,也就是退回1023重新开始读. PushbackReader 2.记录指针当前的位置,如果碰到1023个字节都读取完整而1024个字节只读取半个汉字的时候,还是new String(...),但是只取字节数组中的0-1023处,之后的保存和下一次读取的内容一起new String(...) OK问题解决谢谢各位
CharlotteKong 2013-02-04
  • 打赏
  • 举报
回复
引用 8 楼 gongdath 的回复:
我觉得直接用字符读取不就行了吗?难道有只能用字节读取的需求要求?
当然有,老师要求...
gongdath 2013-02-04
  • 打赏
  • 举报
回复
我觉得直接用字符读取不就行了吗?难道有只能用字节读取的需求要求?
fanstysword 2013-02-04
  • 打赏
  • 举报
回复
不要读一次1024byte就转换为string, 读取所有的byte,把所有byte转换为string
给点代码可以参考以下
int size_btCat = 0;
for(int i = 0;;i ++){
if(m_btCat[i] == 0){
size_btCat = i;
break;
}
}

//when we scan chinese code, because one chinese word need 3bytes,
//so we should get all buffer to change to the string at end
if(buffer[size - 1] == '\r'){

for(int i=0; i < size; i ++){
int tmpSize = size_btCat;
m_btCat[tmpSize + i] = buffer[i];
}

String tmpStrSec = new String(m_btCat, 0, m_btCat.length);
Arrays.fill(m_btCat,(byte)0);
postBroadcast(tmpStrSec);
}
else{
//if string is bigger than 32bytes, we should concat not only times
for(int i=0; i < size; i ++){
int tmpSize = size_btCat;
m_btCat[tmpSize + i] = buffer[i];
}

//m_strCat = m_strCat.concat(str);
}
suciver 2013-02-04
  • 打赏
  • 举报
回复
为什么不能用字符流读取。要把简单的事情复杂化.......。好像没人会规定这种需求的
dracularking 2013-02-04
  • 打赏
  • 举报
回复
引用 3 楼 fangmingshijie 的回复:
改换字符流读取吧
+1 为什么非要用字节流呢
  • 打赏
  • 举报
回复
改换字符流读取吧

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧