Scanner:
Scanner的构造函数有5个重载版本,分别接受一个实参,实参的类型可以是下面的任一种:
InputStream,File,ReadableByteChannel,Readable,String
写了一个测试程序,如下:
public static void main(String[] args) {
Scanner scan = new Scanner(System.in) ;
//scan.useDelimiter("exit");
int count = scan.nextInt() ;
String str = scan.nextLine();
System.out.println(str) ;
}
不知何原因,网上搜索了一下,很过这方面的讲解,先罗列如下:以为scan.nextInt(),只是读取了一个整型值,在键盘上敲击的硬回车符并没有被count接受,所以造成的结果就是剩余一个回车符,当程序进行到scan.nextLine()时,str只是接受了一个回车符。
当使用String str = scan.next() 时,需要人为指定一个结束符,此时可以用到,scan.useDelimiter("exit") ;表示字符串读到到此第一个“exit”处结束。
String str = scan.nextLine() ;读入一行字符串。
StreamTokenizer:
字段摘要:
double navl ------> 如果当前标记是一个数字,则此字段将包含该数字的值。
String sval ------> 如果当前标记是一个文字标记,则此字段包含一个给出该文字标记的字符的字符串。
static int TT_EOF ------>指示已读到流末尾的常量。
static int TT_EOL ------->指示已读到行末尾的常量。
static int TT_NUMBER------->指示已读到一个数字标记的常量。
static int TT_WORD -------> 指示已读到一个文字标记的常量。
int ttype --------> 在调用 nextToken() 方法之后,此字段将包含刚读取的标记的类型。
The StreamTokenizer
class takes an input stream and parses it into "tokens", allowing the tokens to be read one at a time,这些符号的拆分是按照空格来确定的。
public static void main(String[] args) {
int type;
StreamTokenizer tok = new StreamTokenizer(new BufferedReader(
new InputStreamReader(System.in)));
System.out.println("please input :");
try {
while((type=tok.nextToken())!=tok.TT_EOL){
if(type==tok.TT_NUMBER){
System.out.println(tok.nval);
}else if(type==tok.TT_WORD){
if(tok.sval.equalsIgnoreCase("exit"))
{
System.exit(1);
}
System.out.println(tok.sval);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
总结:Scanner 和
StreamTokenizer的区别如上