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 有所帮助。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/291279.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-24 13:14
下一篇 2024-12-24 13:14

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29
  • Java 8 Group By 会影响排序吗?

    是的,Java 8中的Group By会对排序产生影响。本文将从多个方面探讨Group By对排序的影响。 一、Group By的概述 Group By是SQL中的一种常见操作,它…

    编程 2025-04-29

发表回复

登录后才能评论