java 中的字符都是以Unicode进行编码的,那么在字节流中

soccar 2008-04-02 05:54:28
Unicode编码中英文和中文都占两个字节。
那么
InputStream in = new FileInputStream("C:/test.txt");
// test.txt里写的是 abc
int b;
for((b = in.read())!= -1) {
System.out.println((char)b);
}

既然中文英文都占两个字节,那么in.read()每次读出一个字节,即一次只读出来一个英文字母的一半,那么(char)后,岂不是也要变成乱码? 可结果并非乱码
是我哪里理解错了么?
...全文
169 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
tg9525 2010-05-05
  • 打赏
  • 举报
回复
abc属于ASCII字符。。前面都是0的。。而汉字前面都是1.
bxh566 2010-05-05
  • 打赏
  • 举报
回复
InputStream读取的是字节,char是字符
mack1122 2010-05-04
  • 打赏
  • 举报
回复
对呀字节,在任何地方都不需要编码!也不需要转码!任何地方,字节都是一样的!只有字符,才需要转码
ggw321 2010-05-04
  • 打赏
  • 举报
回复
主要是InputStream,OutputStream和Read,Write区别:前者读写都是以字节为单位,后者是以Unicode为单位。
injuer 2010-05-04
  • 打赏
  • 举报
回复
这跟自己的的JDK环境的字符集有关系,中文的字符集是中国计算机研究院指定的GB2312基本中文操作系统上都有,楼主自己获取下JDK用的字符集编码看看,只要不是指定的是GB2312编码规则,在传输或是转换的时候都有几率出现乱码问题。

这是我写的一篇关于实现转换类型的文章你可以参考下
bootupnow 2008-04-02
  • 打赏
  • 举报
回复
首先楼主的这个写法是错误的,基本的语法错误!
int b;
for((b = in.read())!= -1) {
System.out.println((char)b);
}

其次,楼主使用的是Stream的read,所以不管文件怎么样,read都一次只读取1个字节,也就是8位,所以不存在楼主说的什么读取一半的情况。

楼主可能把把InputStream和Reader混淆了,从Reader派生的子类也有read(),这个返回的是一个unicode字符单元,即0---65535的整数。

一段简单的代码如下,楼主观察连个不同的输出,你就明白了!

/**
* t.txt的记录如下:
* Chinses
* 中文
*
* */
public static void main(String[] args) throws IOException{
File f = new File("C:/t.txt");
int b;
InputStream in = new FileInputStream(f);
while((b = in.read()) != -1){
System.out.print((char)b); // 中文 必然会出现???
}

System.out.println();

Reader r = new FileReader(f);
while((b = r.read()) != -1){
System.out.print((char)b); // 这里却相安无事!
}
}
hendy 2008-04-02
  • 打赏
  • 举报
回复
int占4个字节,前三个字节为0。转变成char后,取后两个字节
cangyue87 2008-04-02
  • 打赏
  • 举报
回复
char是字符型,不是字节型喵~~``

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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