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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 凡延海 中级黑马   /  2012-6-1 21:38  /  1564 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我想编写一个把字节输入流编程字符流,却遇到了问题,
public class TestIO {
public static void main(String[] args) {
  InputStreamReader isr=new InputStreamReader(System.in);
  try{
   while((isr.read())!=-1)
   {
    System.out.println(isr.read()+":"+(char)isr.read());
   }
  }
  catch(IOException e){
   e.printStackTrace();
  }
}
}
我输入abc,结果显示是:98:c  
我又输入abc结果是:10:a
    99:
这都是什么什么结果啊,请大家给分析一下。

1 个回复

倒序浏览
因为read方法的返回值是int型,当你输入abc时,你的while循环条件读取了一个字节‘a’,因为a的int值为97不等于-1所以循环执行,这时读到输出语句,输出语句的第一个read读‘b’返回值为98并输出,第二个read读‘c’返回值99,但被你强转了所以输出c;但是你在输入abc后敲了一下回车键相当于输入了两个字符,分别是“\r”“\n”,在读完c后继续进行while判断即又读了一个\r,其值为13也不等于-1,所以执行循环,这时输出语句的第一个read读到\n,其值为10,但并没有输出,因为这个语句还没执行完,但后面已经没有字符了,又由于read方法是一个阻塞式方法,在没有字符时他会等待,所以一直没有输出任何东西,在你再次输入abc敲下回车时上次的输出语句的第二个read方法就读了a这个字符并将第一个read读到的\n的10和a输出,这时while里的read读到b其值为98也不等于-1,所以执行循环,输出语句的第一个read读c返回99第二个read读\r,因为你强转了所以输出他的字符型数据(\r的字符型数据在dos命令行里是看不见的,因为他代表换行符),这时while的read读了\n,判读循环继续,但没有值了于是就又阻塞了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马