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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不抛弃不放弃 中级黑马   /  2013-11-11 00:50  /  1332 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在在字节数组b里面装了4个字母,然后通过ByteArrayInputStream类读取数组中的字母,代码如下
        public static void main (String []args){
     byte[] b= new byte[]{'A','B','C','D'};
   ByteArrayInputStream  in= new ByteArrayInputStream(b);
   while(in.read()!=-1){
   char c=(char)in.read();
  System.out.println(c);

    }
}
读取的时候总是隔一个数,输出结果为:B  D
这是什么原因?我实在看不出来啥毛病 。。。。。。。

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

6 个回复

倒序浏览
while(in.read()!=-1){
判断的时候读取了一个字节
可以这么写:
char c = '';
while (  (c=in.read()) != -1 ) {
Syso: c
回复 使用道具 举报
你使用的是流,也就是说,你read()只要调用一次,流就向后读取了,当你判断while的时候就调用了read(),于是就读取了第一个字母a,但是你没有使用,你又在while当中读取了一个read(),于是就向后顺延,读取了下一个字母B,所以,每次你都跳过了一个就是这个道理

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
hel 中级黑马 2013-11-11 04:18:59
板凳
由于in.read 每次只读取一个字节,
while(in.read()!=-1){  // 在这读取的是A
   char c=(char)in.read(); // 在这读取的是B
   System.out.println(c);   所以在这输出 B,再读一遍后就是输出D
}

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
帖子已分类
回复 使用道具 举报
2l说的有道理,我帮你改了一下,代码如下:
  1. System.out.println("a="+a+"c="+c);*/
  2.                 byte[] b= new byte[]{'A','B','C','D'};
  3.                
  4.                    ByteArrayInputStream  in= new ByteArrayInputStream(b);
  5.                 //BufferedInputStream buf=new BufferedInputStream(b);
  6.                 int len=b.length;
  7.                
  8.                    while((len=in.read())!=-1){
  9.                    char c=(char)len;
  10.                   System.out.println(c);
  11.                 }
复制代码
回复 使用道具 举报
哥们你用的是流。当你第一次做while判断(in.read()!=-1)的时候,这里已经read()执行了一遍了,这个时候你的流相当于读过了A已经指向B,这时运行while循环里面的(char)in.read() 恰好是读取了B并输出。同样的,第二次while循环,判断条件(in.read()!=-1)里面read了C后指向了D,再执行while循环里面的(char)in.read()就读取了D,然后输出。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马