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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 霍明波 中级黑马   /  2012-9-23 10:37  /  2616 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 霍明波 于 2012-9-24 16:47 编辑

对于键盘录入,毕老师说闭着眼睛写下面的代码
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
昨天了解到:Scanner in = new Scanner(System.in);
也可以键盘录入,不知道这种方式有没有人知道,该怎么理解呢,怎么使用呢,两种哪个更好点呢

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

13 个回复

正序浏览
public final class Scannerextends Objectimplements Iterator<String>一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。

Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。

例如,以下代码使用户能够从 System.in 中读取一个数:

     Scanner sc = new Scanner(System.in);
     int i = sc.nextInt();
再看一个例子,以下代码使 long 类型可以通过 myNumbers 文件中的项分配:

      Scanner sc = new Scanner(new File("myNumbers"));
      while (sc.hasNextLong()) {
          long aLong = sc.nextLong();
      }扫描器还可以使用不同于空白的分隔符。下面是从一个字符串读取若干项的例子:

     String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
     System.out.println(s.nextInt());
     System.out.println(s.nextInt());
     System.out.println(s.next());
     System.out.println(s.next());
     s.close(); 输出为:

     1
     2
     red
     blue 以下代码使用正则表达式同时解析所有的 4 个标记,并可以产生与上例相同的输出结果:

     String input = "1 fish 2 fish red fish blue fish";
     Scanner s = new Scanner(input);
     s.findInLine("(\\d+) fish (\\d+) fish (\\w+) fish (\\w+)");
     MatchResult result = s.match();
     for (int i=1; i<=result.groupCount(); i++)
         System.out.println(result.group(i));
     s.close();
Scanner的功能适合获取想要的数据,Buffer具体有缓存,具体谁好,要看你的用途。

点评

恭喜10分了  发表于 2012-9-24 22:20

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
我更喜欢  System.in的录入方式
回复 使用道具 举报
已解决,我再研究研究
回复 使用道具 举报
其实二者实现的效果是以一样的,就看个人的喜好,不过个人对于从终端获取输入的数据,更喜欢Scanner一点,毕竟该类可以对不同类型进行直接的获取,比如nextInt,nextBoolean等,如果是纯粹的IO流的操作,还需要进行相应的转换操作,多出了一步,这是本人所不赞同的。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
尤圣回 发表于 2012-9-23 11:02
Scanner in = new Scanner(System.in);和c语言的Scanf输入是一样的 就好像打印语句在java中是print 在c中是 ...

其实java中也有printf()方法.
回复 使用道具 举报
孔肖 发表于 2012-9-23 10:59
查了下文档,Scanner是JDK1.5以后才出现的,它是一个可以使用正则表达式来解析基本类型和字符串的简单文本 ...

"Scanner取得输入的依据是空格符,包括空格键,Tab键和Enter键。当按下这其中的这些键时,Scanner就会返回下一个输入。所以 当录入的内容中包括空格时,
显然,使用Scanner就不能完整的获得录入的字符串。这时候我们就还需要使用BufferedReader来完成。"

同学,Scanner类是可以将换行符作为结束字符的.你一开始不就说了,Scanner类可以使用正则表达式来解析基本类型和字符串的简单文本,正则表达式是丰富多彩的,当然可以用换行符来作为结束字符了.
详见Scanner类的useDelimiter()方法.
回复 使用道具 举报
霍明波 发表于 2012-9-23 10:56
这个是开源代码吗

只要是JDK的代码,全开源.
回复 使用道具 举报
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
InputStreamReader 就是一个可以从 System.in 里面读取东西的管道
然后BufferedReader 就是比InputStreamReader 更高级的 更粗点的管道 可以嵌套在InputStreamReader的外面 从而实现缓冲功能 并且可以用外层管道的readLine()方法读取一行数据
依次类推 一种低级字节流管道的管道 我们可以在其外面嵌套一个更高级的数据流管道   从而更加方便的读写数据

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
霍明波 发表于 2012-9-23 10:56
这个是开源代码吗

java都是开源的。那你说代码呢?
回复 使用道具 举报
Scanner in = new Scanner(System.in);和c语言的Scanf输入是一样的 就好像打印语句在java中是print 在c中是printf   其实都是封装好的代码 所以哪个都一样

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
查了下文档,Scanner是JDK1.5以后才出现的,它是一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。能够方便我们读取键盘录入。
例如 :import java.util.Scanner;
            public class TestScanner{
                  public static void main(String[] args){
                          Scanner scan = new Scanner(System.in);
                          System.out.println("请输入一个字符串:");
                          System.out.println("您输入的字符串是:" + scan.next());  //它的next()方法和BufferedReader中的readLine()方法差不多,都可以获取录入的字符串
                  }
           }

看上去,Scaner貌似比BufferedReader要简便。。。但是简便的也要有相应的弊端。。。

Scanner取得输入的依据是空格符,包括空格键,Tab键和Enter键。当按下这其中的这些键时,Scanner就会返回下一个输入。所以 当录入的内容中包括空格时,
显然,使用Scanner就不能完整的获得录入的字符串。这时候我们就还需要使用BufferedReader来完成。
BufferedReader的readLine()方法也是根据Enter来获取字符的,它返回的是用户在按下Enter键之前录入的所有字符,不包括最后按下的Enter返回字符。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
明光照 发表于 2012-9-23 10:49
个人认为下面的那个Scanner容易一些,Scanner是util包中的类。直接定义一个变量=in.next(),或者nextInt()。 ...

这个是开源代码吗
回复 使用道具 举报
个人认为下面的那个Scanner容易一些,Scanner是util包中的类。直接定义一个变量=in.next(),或者nextInt()。这个看你想要输入的数据类型。而上面的BufferedReader是io包中的类,是一个缓冲字符流,为了能够输入字节数据,在后面new 了一个InputStreamReader的转换流,而且输入完成之后还要去关闭流。这样一看就比较繁琐。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马