您的位置:

Java 中的新扫描器 NewScanner 介绍

一、引言

在 Java 程序中,读取用户输入是一个重要的操作。Scanner 类是 Java 中读取控制台输入的标准类,但是它在处理输入时有一些限制,比如只能按照空格或者回车分割输入。为了克服这些限制,Java SE 8 引入了一个新的扫描器类 NewScanner,它可以更自由地处理用户输入。本文将介绍 Java 中的新扫描器 NewScanner 的使用方法和相应的例子。

二、NewScanner 类的概述

Java 中的新扫描器 NewScanner 是在 Java SE 8 中引入的。NewScanner 类提供了更灵活和方便的方法来读取用户输入。它支持使用自定义分隔符、正则表达式、字符集等方式读取输入,这使得我们可以更好地处理用户输入。下面是 NewScanner 类的构造方法:

public NewScanner(InputStream source, String charsetName)
public NewScanner(InputStream source)
public NewScanner(Path source, Charset charset) throws IOException
public NewScanner(Path source) throws IOException
public NewScanner(Readable source)
public NewScanner(ReadableByteChannel source)
public NewScanner(SocketChannel source) throws IOException
public NewScanner(java.io.File file, String charsetName) throws FileNotFoundException
public NewScanner(java.io.File file) throws FileNotFoundException
public NewScanner(String source)

其中最常用的是传入字符串或 System.in :

NewScanner scanner = new NewScanner(System.in);

三、NewScanner 类的方法

1. next() 方法

next() 方法会读取输入中的下一个字符串,并且自动跳过分隔符,直到下一个字符串。下面是 next() 方法的示例程序:

import java.util.*;

public class NewScannerDemo {
    public static void main(String[] args) {
        NewScanner scanner = new NewScanner(System.in);
        System.out.println("Enter your name: ");
        String name = scanner.next();
        System.out.println("Your name is " + name);
    }
}

当我们运行这个程序时,它会提示我们输入名字。我们输入 "Tom Jerry" 作为名字,程序只会输出 "Your name is Tom",而 "Jerry" 被忽略了,因为它使用空格作为分割符。

2. useDelimiter() 方法

useDelimiter() 方法用于设置分隔符,以便在读取 input() 时使用。这个方法的默认分隔符是空格。下面是使用 useDelimiter() 方法的示例程序:

import java.util.*;

public class NewScannerDemo {
    public static void main(String[] args) {
        NewScanner scanner = new NewScanner(System.in);
        scanner.useDelimiter(",");
        System.out.println("Enter your name and age: ");
        String name = scanner.next();
        int age = scanner.nextInt();
        System.out.println("Your name is " + name.trim() + " and age is " + age);
    }
}

在这个程序中,我们使用 useDelimiter() 方法将逗号设置为分隔符,这意味着输入中的字符串将在遇到逗号时被切分为不同的标记。这里我们读取了两个标记:名字和年龄。如果我们输入 "Tom, 20",那么程序会输出 "Your name is Tom and age is 20"。

3. hasNext() 和 hasNextLine() 方法

hasNext() 和 hasNextLine() 方法都是用来检测输入中是否还有下一个标记。hasNext() 和 hasNextLine() 方法的主要区别是前者只检查下一个标记是否存在,而后者则检查整行是否输入完毕。下面是使用这两个方法的示例程序:

import java.util.*;

public class NewScannerDemo {
    public static void main(String[] args) {
        NewScanner scanner = new NewScanner(System.in);

        System.out.println("Enter your name: ");
        boolean inputIsString = scanner.hasNext();
        if (inputIsString) {
            String name = scanner.nextLine();
            System.out.println("Your name is " + name);
        }

        System.out.println("Enter your age: ");
        boolean inputIsInt = scanner.hasNextInt();
        if(inputIsInt) {
            int age = scanner.nextInt();
            System.out.println("Your age is " + age);
        }
    }
}

在这个程序中,我们使用了两个方法:hasNext() 和 hasNextLine()。前者用于检查是否有下一个标记,后者用于检查是否有输入行。如果输入行中有多个标记,那么第一个标记将被读取并在第一次调用时返回 true。如果用户输入了一个字符串和一个整数 "Tom\n20",那么程序会输出 "Your name is Tom" 和 "Your age is 20"。

4. reset() 方法

reset() 方法用于将 NewScanner 对象重置为原始状态。这个方法可以用来重新扫描输入,或者在重复使用 NewScanner 对象时进行处理。下面是使用 reset() 方法的示例程序:

import java.util.*;

public class NewScannerDemo {
    public static void main(String[] args) {
        NewScanner scanner = new NewScanner(System.in);

        System.out.println("Enter your name and age: ");
        String name = scanner.next();
        int age = scanner.nextInt();
        System.out.println("Your name is " + name + " and age is " + age);

        // Reset the scanner
        scanner.reset();
        scanner.useDelimiter(",");

        // Read two tokens
        System.out.println("Enter your name and age separated by a comma: ");
        String name2 = scanner.next();
        int age2 = scanner.nextInt();
        System.out.println("Your name is " + name2 + " and age is " + age2);
    }
}

在这个程序中,我们首先读取了输入中的两个标记(名字和年龄),然后通过 reset() 方法将 NewScanner 对象重置为原始状态。接下来,我们使用 useDelimiter() 方法将逗号设置为分隔符并再次读取两个标记。这里,如果我们输入 "Tom Jerry, 20",那么程序会输出 "Your name is Tom Jerry and age is 20" 和 "Your name is Tom Jerry and age is 20"。

5. skip() 方法

skip() 方法用于跳过输入中一定数量的字节,从而允许我们跳过一些不必要的输入。下面是使用 skip() 方法的示例程序:

import java.util.*;

public class NewScannerDemo {
    public static void main(String[] args) {
        NewScanner scanner = new NewScanner(System.in);

        while (true) {
            System.out.println("Enter your age: ");
            if (scanner.hasNextInt()) {
                int age = scanner.nextInt();
                System.out.println("Your age is " + age);
                break;
            }
            else {
                System.out.println("Invalid input");
                scanner.skip(".*\n");
            }
        }
    }
}

在这个程序中,我们使用了一个 while 循环以允许用户多次输入,直到输入为整数。如果输入不是整数,那么程序将输出 "Invalid input" 并使用 skip() 方法跳过整行输入。这里我们使用了一个正则表达式,即 .*,它匹配输入行的任何内容。如果我们输入了 "abc\n123",那么程序会输出 "Invalid input" 和 "Your age is 123"。

6. findInLine() 方法

findInLine() 方法用于在当前行中查找指定的正则表达式。它类似于 nextLine() 方法,但是它只查找指定的正则表达式,并返回一个字符串。下面是使用 findInLine() 方法的示例程序:

import java.util.*;

public class NewScannerDemo {
    public static void main(String[] args) {
        NewScanner scanner = new NewScanner(System.in);

        String pattern = "\\w+"; //匹配单词
        String input = "Hello, Java!";

        scanner = new NewScanner(input);
        System.out.println(scanner.findInLine(pattern)); // 输出 Hello
    }
}

在这个程序中,我们使用了一个正则表达式,即 \\w+,它匹配输入中的单词。在这个例子中,我们将 input 设置为 "Hello, Java!",然后使用 findInLine() 方法来查找单词。如果我们运行这个程序,它会输出 "Hello"。

四、小结

在本文中,我们介绍了 Java SE 8 中新扫描器 NewScanner 的使用方法和相应的例子。NewScanner 类提供了更灵活和方便的方法来读取用户输入,它支持使用自定义分隔符、正则表达式、字符集等方式读取输入。我们介绍了 NewScanner 类的一些主要方法,包括 next() 方法、useDelimiter() 方法、hasNext() 和 hasNextLine() 方法、reset() 方法、skip() 方法和 findInLine() 方法。希望本文对你了解和使用 Java 中的新扫描器 NewScanner 有所帮助。