A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沈浩 中级黑马   /  2013-4-18 20:18  /  1529 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 沈浩 于 2013-4-21 14:07 编辑

一个字符是两个字节
字符流一次读两个字节  所以字符流一次可以读取一个字符数据
字节流一次读一个字节  那读取一个字符的数据是不是要读两次
然而在用字节流读字符数据时为什么读一次的数据就是一个字符的数据  例如‘a’而不是读两次
难道字符只用了一个字节表示    如果是的话  那字符流一次不是可以读两个字符的数据  
感觉有点不解   希望大家帮解释哈  多谢

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

6 个回复

倒序浏览
字符流与字节流都是读的二进制数,字符流只是jvm自带了编码集,所以能用来解析出文字出来,字符流是处理两个字节为单位,字节流可以处理一切对象,但它不能Unicode字符,而字符流就可以。对于上面你说的a,如果你用字节流,他就是以1个字节为单位,97够装了,如果你用字符流,a就是装在2个字节的空间里。字符不是只用1个字节表示,你可以联想一点,中国的字有多少,1个字节能装完吗,显然不够,utf-8把装了全世界的编码集,1个字节又怎么够。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
分两点回答,1,字符流并不是只处理两个字节,主要看设置的字符集,还有要处理的字符。
                  2,字符a在你默认的字符集gbk中只占有一个字节。
字符流的底层方法是字节流的,只是字符流把字节流封装进去,使用字节流读写,中间加了一层字符流的编码解码功能,所以这可以解释为什么字符流可以处理单个字节。还有,字母和数字还有标点,除了unicode字符集,其它的字符集,比如UTf-8(unicode的升级版),都是以单个字节表示的。建议多看几遍io中的编码解码,多思考,多试验。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
其实字符流底层也是一次读取一个字节。当读取一个字节后,暂时存放在一个缓存区里,当读完两次,即读到两个字节后才去查表,如果读入一个字节就去查表,相当于你只拿到了字符的一般去查表,那是不可能的,
而字节流是读取一次就传送。
一个字符是两个字节表示的

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
gerenvip 发表于 2013-4-20 11:00
其实字符流底层也是一次读取一个字节。当读取一个字节后,暂时存放在一个缓存区里,当读完两次,即读到两个 ...

假如有两个字符ab  用字节流读取只读了两次就能读到 证明a和b分别占一个字节
字符流一次读两个字节  为什么没一次把这两个字节读出来   而也是要读两次  
这个怎么理解
求解释
回复 使用道具 举报
沈浩 发表于 2013-4-20 18:56
假如有两个字符ab  用字节流读取只读了两次就能读到 证明a和b分别占一个字节
字符流一次读两个字节  为什 ...

不好意思,白天没有上网。楼上两位的回答不知道你看了没有。你看看二楼说的。二楼说了,“对于上面你说的a,如果你用字节流,他就是以1个字节为单位,97够装了,如果你用字符流,a就是装在2个字节的空间里。字符不是只用1个字节表示,你可以联想一点,中国的字有多少,1个字节能装完吗,显然不够,utf-8把装了全世界的编码集,1个字节又怎么够。”
a和b存放的空间的确是2字节。a和b事实上都只占用一个字节。这点没问题。你用字节流取时。由于每两个字节中只有一个字节有数据,所以你两次就能取出a和b
但是如果你试验用的不是ab而是汉字“你好”,你看看读出几次?中国的汉字在编码表中占两个字节,很多其他字符也占用俩字节。所以我说字符流读取一个字符,其实底层调用两次字节流的读操作。
下面给出了一个小演示代码:
第一次,你在a.txt中存ab 控制台读出ab
第二次,你把a.txt中内容换成“你好”,打印结果是

?
?
?
这样你应该明白了吧?
  1. import java.io.*;
  2. class  Test
  3. {
  4.         public static void main(String[] args) throws IOException
  5.         {
  6.                 FileInputStream fis = new FileInputStream("a.txt");
  7.                

  8.                 int ch = 0;
  9.                 while((ch=fis.read())!=-1)
  10.                 {
  11.                         System.out.println((char)ch);
  12.                 }
  13.         }
  14. }
复制代码
回复 使用道具 举报
黄玉昆 黑马帝 2013-4-21 07:39:54
7#
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马