使用Scanner类可以很方便地获取用户的键盘输入,Scanner是一个基于正则表达式的文本扫描器,它可以从文件、输入流、字符串中解析出基本类型值和字符串值。Scanner类提供了多个构造器,不同的构造器可以接收文件、输入流、字符串作为数据源,用于从文件、输入流、字符串中解析数据。
Scanner主要提供了两个方法来扫描输入。
- hasNextXxx():是否还有下一个输入项,其中Xxx可以是Int、Long等代表基本数据类型的字符串。如果只是判断是否包含下一个字符串,则直接使用hasNext()。
- nextXxx():获取下一个输入项。Xxx的含义与前一个方法中的Xxx相同。
默认情况下,Scanner使用空白(包括空格、Tab空白、回车)作为多个输入项之间的分隔符。
下面程序使用Scanner来获得用户的键盘输入。
public class ScannerKeyBoardTest
{
public static void main(String[] args)
{
//System.in 代表标准输入,就是键盘输入
Scanner sc=new Scanner(System.in);
//增加下面一行将只把回车作为分隔符
//sc.useDelimiter("\n");
//判断是否还有下一个输入项
while(sc.hasNext())
{
//输出输入项
System.out.println("键盘输入的内容是:"+sc.next());
}
}
}
运行上面程序,程序通过Scanner不断从键盘读取键盘输入,每次读到键盘输入后,直接将输入内容打印在控制台。如果希望改变Scanner的分隔符(不是用空白作为分隔符),为Scanner设置分隔符使用useDelimiter(String pattern)方法即可,该方法的参数应该是一个正则表达式,只需要把上面程序中粗体代码行的注释去掉,该程序就会把键盘的每行输入当成一个输入项,不会以空格、Tab空白等作为分隔符。
事实上,Scanner提供了两个简单的方法来逐行读取。
- boolean hasNextLine():返回输入源中是否还有下一行。
- String nextLine():返回输入源中下一行的字符串。
注意:Scanner的读取操作可能被阻塞(当前执行顺序流暂停)来等待信息的输入。如果输入源没有结束,Scanner又读不到更多输入项时(尤其在键盘输入时比较常见),Scanner的hasNext()和next()方法都有可能阻塞,hasNext()方法是否阻塞与和其相关的next()方法是否阻塞无关。
Scanner不仅能读取用户的键盘输入,还可以读取文件输入。只要在创建Scanner对象时传入一个File对象作为参数,就可以让Scanner读取该文件的内容。
public class ScannerFileTest
{
public static void main(String[]args) throws Exception
{
Scanner sc=new Scanner(new File("ScannerFileTest.java"));
System.out.println("ScannerFileTest.java 文件内容如下:");
while(sc.hasNextLine())
{
System.out.println(sc.nextLine());
}
}
}
因为上面程序涉及文件输入,可能引发文件IO相关异常,故主程序声明throws Exception表名main不处理任何异常。