java.util.scanner类用来从控制台读取字符串和基本类型数值。Scanner可以将输入分为由空白字符分隔的有用信息。

为了能从键盘读取,需要为System.in创建一个Scanner

Scanner input = new Scanner(System.in);

为了从文件中读取,为文件创建一个Scanner

Scanner input = new Scanner (new File(filename));

Scanner 中常用方法

Scanner (source:File) 创建一个所产生的值都是从特定文件扫描而来的扫描器
Scanner (source:String)创建一个所产生的值都是从特定字符串扫描而来的扫描器
close                                    关闭这个扫描器
hasNext():boolean                如果这个扫描器还有可读的数据则返回true
next():String                        从这个扫描器返回下一个标志作为字符串
nextLine():String                  使用行分隔符从这个扫描器返回一个行结束
nextInt():int                           从这个扫描器返回下一个标志作为一个int值
useDelimiter(pattern:String):Scanner 设置这个扫描器的分隔模式并返回这个扫描器

方法nextByte(); nextShort(); nextInt();nextLong();next()等都称为令牌读取方法,一个令牌读取方法首先跳过任意分隔符(默认情况下是空格);然后读取一个以分隔符结束的令牌。然后,对应于nextByte(); nextShort(); nextInt();nextLong(),这个令牌就分别被自动地转换为byte、short、int、long型的值。对于next()方法而言是无须做转换的。

方法next()和nextLine()都会读取一个字符串。next()方法读取一个由分隔符分隔的字符串,但是nextLine()读取一个以行分隔符结束的行

 令牌读取方法不能读取令牌后面的分隔符。如果在令牌读取方法之后调用nextLine(),该方法读取从这个分隔符开始,到这行的行分隔符结束的字符。这个行分隔符也被读取,但是它不是nextLine()返回的字符串部分。

  假设一个名为test.TXT的文本文件包含一行

  34  567

   在执行完下面的代码之后 

intValue的值为34 ,而line 包含的字符是 ‘ ’、‘5’、‘6’、‘7’

如果输入是从键盘键入,那会发生什么呢  ?假设为下面的代码输入34,然后按回车键,接着输入567,然后按回车键

Scanner input =new Scanner(System.in);
         int intValue =input.nextInt();
         String line=input.nextLine();

将会得到intValue 值是34,而line中是一个空的字符串。原因如下,令牌读取方法nextInt()读取34,然后在分隔符处停止,这里的分隔符是行分隔符(回车键)。nextLine()方法会在读取行分隔符之后结束,然后返回在行分隔符之前的字符串。因为在行分隔符之前没有字符,所以line是空的。