黑马程序员技术交流社区

标题: System.setIn的执行顺序问题 [打印本页]

作者: 高鑫    时间: 2012-6-21 00:55
标题: System.setIn的执行顺序问题
本帖最后由 高鑫 于 2012-6-22 14:33 编辑
  1. import java.io.*;
  2. class Hello
  3. {
  4.         public static void main(String args[])throws IOException
  5.         {
  6.                
  7.              BufferedReader br=
  8.                      new BufferedReader(new InputStreamReader(System.in));
  9.              BufferedWriter bw=
  10.                      new BufferedWriter(new OutputStreamWriter(System.out));
  11.              String s=null;
  12.              System.setIn(new FileInputStream("Hello.java"));
  13.             while((s=br.readLine())!=null)
  14.             {
  15.                     if(s.equals("over"))
  16.                             break;
  17.                     bw.write(s.toUpperCase());
  18.                     bw.newLine();
  19.                     bw.flush();
  20.                            
  21.             }
  22.         }
  23. }
复制代码
为什么把system.setIn这句放在while循环上,就无法改变System.in了??谁能详细给我介绍下这个程序的执行步骤,什么时候从控制台录入数据,什么时候执行循环,详细点,谢谢。有朋友说我的问题不是太清楚,我重新问一下,我理解是BufferedReader br=  new BufferedReader(new InputStreamReader(System.in));执行到的时候,程序暂停,等待控制台输入,当输入了字符之后,程序才继续执行下面的语句,直到结束,我的理解对吗??
作者: 闾丘日月    时间: 2012-6-21 01:02
本帖最后由 闾丘日月 于 2012-6-21 01:11 编辑

我猜一下你的问题吧,表述的不是太清楚
你是不是想把hello.java中的文件输出的屏幕
如果是这样的话你应该在关联System.in这个流之前将这个System.in给改掉,也就是说setIn方法写在Buffered那行前面就没问题。
但有可能你要问的问题不是这个。

作者: 丁二跃    时间: 2012-6-21 01:23
为什么把system.setIn这句放在while循环上,就无法改变System.in了??谁能详细给我介绍下这个程序的执行步骤,什么时候从控制台录入数据,什么时候执行循环,详细点,谢谢


不是无法改变System.in,此处你已经改变了标准输入,但是你br的赋值在改变之前,所以其仍旧从控制台接收数据。
  1. import java.io.*;
  2. class Hello
  3. {
  4.         public static void main(String args[])throws IOException
  5.         {
  6.                
  7.              BufferedReader br=
  8.                      new BufferedReader(new InputStreamReader(System.in));
  9.              BufferedWriter bw=
  10.                      new BufferedWriter(new OutputStreamWriter(System.out));
  11.              String s=null;
  12.             
  13.              System.setIn(new FileInputStream("i:/ccc/t.java"));
  14.             
  15.             while((s=br.readLine())!=null)
  16.             {
  17.                     if(s.equals("over"))
  18.                             break;
  19.                     bw.write(s.toUpperCase());
  20.                     bw.newLine();
  21.                     bw.flush();
  22.                            
  23.             }
  24.             
  25.             br=new BufferedReader(new InputStreamReader(System.in));
  26.             while((s=br.readLine())!=null)
  27.             {
  28.                     if(s.equals("over"))
  29.                             break;
  30.                     bw.write(s.toUpperCase());
  31.                     bw.newLine();
  32.                     bw.flush();
  33.                            
  34.             }
  35.         }
  36. }
复制代码
如上,在你敲入  over 后将会输出文件内容i
作者: 孙安庆    时间: 2012-6-21 01:39
问题不是把system.setIn这句放在while循环上,而是应该问为什么放在了BufferedReader下面,输入流却没有改变?
先改变流,下面如果用到了输入流,java会自动替换,这应该是底层实现;如果后改变流,但是BufferedReader不知道啊,
他用的还是原来的。自己多试几次就明白了
作者: 高鑫    时间: 2012-6-21 14:00
我吧问题明确了下,大家可以帮我看下
作者: 黑马_张佳超    时间: 2012-6-21 17:40
  1. class Hello
  2. {                /*
  3.                  *先创建控制台输入的br对象和输出的bw对象。初始化的br对象在调用readLine()方法时处于等待输入状态。
  4.                  *然后执行System.setIn();虽然修改了标准输入的源,但是,br对象并为修改标准输入的方式,要想setIn()生效需重新创建br的实例对象。
  5.                  *即:br = new BufferedReader(new InputStreamReader(System.in)); 注意,要在修改标准输入方式之后创建新的br对象。
  6.                  *最后就是执行的循环操作,如果在br没有被重新创建的时候,只能按照开始定义的控制台输入的方式来执行程序。也就是当你输入over的时候才能停止程序。
  7.                  */
  8.         public static void main(String args[])throws IOException
  9.         {
  10.              BufferedReader br=
  11.                      new BufferedReader(new InputStreamReader(System.in));
  12.              BufferedWriter bw=
  13.                      new BufferedWriter(new OutputStreamWriter(System.out));
  14.              String s=null;
  15.              System.setIn(new FileInputStream("Hello.java"));
  16.             while((s=br.readLine())!=null)
  17.             {
  18.                     if(s.equals("over"))
  19.                             break;
  20.                     bw.write(s.toUpperCase());
  21.                     bw.newLine();
  22.                     bw.flush();
  23.             }
  24.         }
  25. }
复制代码

作者: 徐传任    时间: 2012-10-10 12:17
看看...........................




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