JDK1.7 API -- Scanner (一)

2014-11-24 11:03:53 · 作者: · 浏览: 0

个人英文水平有限,勉强凑合看。。

Class Scanner

java.util.Scanner

Scanner所实现的接口:
Closeable, AutoCloseable, Iterator

public final class Scanner extends Object implements Iterator, Closeable
这是一个可以使用正则表达式来解析基本数据类型和字符串的简单的文本扫描器。
Scanner将输入数据用分隔符分隔开来,默认通过空格来分隔输入数据。被分隔出来的各个数据段可以通过调用多种多样的next()方

法被转换成不同的数据类型。

例如,下面的代码允许用户从标准输入中读入整数:
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
再如,下面的代码可以从文件中读入长整形数据:
Scanner sc = new Scanner(new File("myNumbers"));
while (sc.hasNextLong()) {
long aLong = sc.nextLong();
}

Scanner也可以把除空格符以外的字符做为分隔符,下面的例子从一个字符串中读入了多项数据:
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
也可以使用正则表达式一次性地将数据分隔完毕,如:
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 通过Character.isWhitespace()方法来判断一个字符是否是默认的空格分隔符。Reset()方法会将Scanner默认的分隔符重

设为空格,而不管之前是否曾经改变过Scanner的默认分隔符.
扫描操作可能为因为等待输入而发生阻塞。

Next()方法、hasNext()方法和它们对应的基础数据类型版本的方法(如nextInt(),hasNextInt()等等)首先会跳过符合指定格式的输

入数据,然后会将路过的部分返回。Next()方法和hasNext()方法都可能会因为等待输入而发生阻塞。但是,next()方法会不会阻塞

跟hasNext()方法会不会阻塞是没有任何关系的。

findInLine()方法、findWithinHorizon()方法和skip()方法忽略默认的分隔符。这些方法会尝试着去匹配参数中指定的格式而忽略

默认分隔符的影响,因此可以在某些需要特定格式的情况下使用。这几个方法都可能为因为等待输入而发生阻塞。

当一个Scanner抛出一个InputMismatchException时,Scanner会跳过发生异常的数据段。这些被路过的数据段可以通过一些方法来获

取。

Scanner有可能会返回一个空的数据段。例如,指定"\\s+"格式时,如果有多个数据段符合这个格式,那Scanner将返回空。

Scanner可以从任何实现了Readable接口的对象中读取数据。如果实现了Readable接口的这些对象调用了read方法,并且抛出了

IOException异常,那么Scanner会认为已经读到了数据结尾。我们可以通过ioException()方法来获取最近抛出的IOException异常

当一个Scanner被关闭时,它也会关闭与它相关联的数据输入源。

Scanner不是线程安全的类。

向Scanner类的任何方法传递null引用都会引发 NullPointerException 异常。

Scanner默认会用10进制的方式来处理数字,除非使用了 useRadix(int)方法来指定进制。reset()方法会将Scanner的进制重设为

10.


构造方法:
Scanner(File source)
构造一个可以从指定文件中读取数据的Scanner.

Scanner(File source, String charsetName)
构造一个可以从指定文件中读取数据的Scanner.(使用指定的字符集)

Scanner(InputStream source)
构造一个从指定的输入流读取数据的Scanner.

Scanner(InputStream source, String charsetName)
构造一个从指定的输入流读取数据的Scanner.(使用指定的字符集)

Scanner(Path source)
构造一个可以从指定路径的文件中读取数据的Scanner.

Scanner(Path source, String charsetName)
构造一个可以从指定路径的文件中读取数据的Scanner.(使用指定的字符集)

Scanner(Readable source)
构造一个从指定资源中读取数据的Scanner.

Scanner(ReadableByteChannel source)
构造一个从指定频道中读取数据的Scanner.

Scanner(ReadableByteChannel source, String charsetName)
构造一个从指定频道中读取数据的Scanner.(使用指定的字符集)

Scanner(String source)
构造一个从指定字符串对象中读取数据的Scanner.

成员方法:
void close()
关闭Scanner.

Pattern delimiter()
返回Scanner当前正在使用的匹配格式。

String findInLine(Pattern pattern)
用指定的格式读取数据。

String findInLine(String pattern)
用指定的格式读取数据。

boolean hasNext()
如果输入中还有数据段,则返回真。

boolean hasNext(Pattern pattern)
如果输入中还有满足指定格式的数据段,则返回真。

boolean hasNext(String pattern)
如果输入中还有满足指定格式的数据段,则返回真。

boolean hasNextBigDecimal()
如果下一个数据段可以用nextBigDecimal()转换成长小数,则返回真。

boolean h