黑马程序员技术交流社区

标题: io流中System.in的问题 [打印本页]

作者: 罗广伟    时间: 2013-7-10 10:57
标题: io流中System.in的问题
本帖最后由 杨兴庭 于 2013-7-10 22:35 编辑
  1. BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
复制代码
这个语句是将键盘输入的字节流转为字节流,键盘输入时输入的是字符,为什么要变成System.in表示的字节流而不是以字符流存在呢,这样做用意是什么?

作者: sunalong    时间: 2013-7-10 11:25
读取键盘录入。
System.out:对应的是标准输出设备,控制台。
System.in:对应的标准输入设备:键盘。

  1. /*

  2. 需求:
  3. 通过键盘录入数据。
  4. 当录入一行数据后,就将该行数据进行打印。
  5. 如果录入的数据是over,那么停止录入。

  6. */
  7. import java.io.*;
  8. class  ReadIn
  9. {
  10.         public static void main(String[] args) throws IOException
  11.         {
  12.                 InputStream in = System.in;
  13.                 StringBuilder sb = new StringBuilder();

  14.                 while(true)
  15.                 {
  16.                         int ch = in.read();
  17.                         if(ch=='\r')
  18.                                 continue;
  19.                         if(ch=='\n')
  20.                         {
  21.                                 String s = sb.toString();
  22.                                 if("over".equals(s))
  23.                                         break;
  24.                                 System.out.println(s.toUpperCase());
  25.                                 sb.delete(0,sb.length());
  26.                         }
  27.                         else
  28.                                 sb.append((char)ch);

  29.                 }
  30.         }
  31. }
复制代码

作者: 草貌路飞    时间: 2013-7-10 11:26
自己的理解:System.in是可以用System.setIn方法来设置输入流的,如果设置的是字节码文件字符流就不能读了,所以最好用什么都可以读的字节流。
作者: sunalong    时间: 2013-7-10 11:28
这样无论键盘输入的是汉字(占两个字符)还是英文字符(占一个字符)都能被接收,
作者: 左手神刀    时间: 2013-7-10 11:45
System 是java.lang 包中的一个类,in是这个类中的一个成员变量,java在定义这个成员变量的时候是怎么定义的:public static final InputStream in。in默认对应的是标准的输入设备是键盘。
所以键盘输入数据一定是InputStream类型的数据,即字节。所以我们要用字节流(InputStreamReader)来接收,
至于为什么要把in定义成字节型的,我就不太知道了,估计是因为对键盘的物理操作都靠电流的开闭来实现,就好像是0101010这样的数字一样,把in定义成字节的便于接收吧(以上都是个人观点,不属于权威,呵呵 ,相互交流一下)。
作者: 张承富    时间: 2013-7-10 12:12
首先你还没明白字符流的概念,只有文本文件里的才是字符流,键盘输入进来的还是字节流
作者: 王丽达    时间: 2013-7-10 13:02
主要是因为字符流比字节流操作更方便,体现在读的时候,想要一次读一行内容,普通Reader得被BufferedReader所装饰(由于一次读一行的方法readLine()只存在于BufferedReader中),而怎么获得BufferedReader呢,这时就要通过转换流InputStreamReader把字节流转换成字符流,读取字符流的Reader被BufferedReader修饰后,就可以用readLine()整行读取了。

1.System.in代表键盘输入,实际录入的是字节流。
2.通过InputStreamReader将字节流转换成字符流,但字符流只能被普通的Reader读取,想要整行读取,只能通过BufferedReader将Reader修饰。
3.字符流被BufferedReader中的readLine()整行的读取。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2