欢迎访问宙启技术站
智能推送

Java中如何使用Scanner函数实现用户输入的数据读取和解析?

发布时间:2023-05-20 01:21:06

Scanner是Java中常用的类,可以实现控制台输入的数据读取和解析。通过使用Scanner类,Java程序可以读取用户从键盘或其他设备输入的数据,并将这些数据解析为Java程序可以使用的各种数据类型。在本文中,我们将详细介绍Java如何使用Scanner函数实现用户输入的数据读取和解析。

一、Scanner类的基本结构

Scanner类属于java.util包,因此在Java程序中使用Scanner函数时,需要使用“import java.util.Scanner;”语句导入Scanner类。Scanner类的基本结构如下:

public final class Scanner extends Object implements Iterator<String>, Closeable

上述代码给出了Scanner类的基本结构。Scanner类是一个final类,意味着它不能被继承。这个类实现了Iterator<String>和Closeable接口,并继承了Object类,因此Scanner对象可以用来迭代String类型的元素,以及可以被关闭。这里需要注意,Scanner类的实例对象通常不是由new关键字创建的,而是从现有的流中创建的。

二、Scanner函数的基本用法

在Java中使用Scanner类实现用户输入的数据读取和解析很简单。下面我们来看一下Scanner函数的具体使用方法。

1、创建Scanner对象

在使用Scanner函数时,需要先创建一个Scanner对象,通常使用下面的语句创建:

Scanner in = new Scanner(System.in);

上述代码使用System.in作为输入流来创建一个Scanner对象。

2、读取用户输入的数据

使用Scanner对象的不同方法可以从输入流中读取不同类型的数据。主要方法有:

next() - 读取输入流中的下一个单词(以空格作为分界符)。

nextInt() - 读取输入流中的下一个整数值。

nextDouble() - 读取输入流中的下一个浮点数值。

nextLine() - 读取输入流中的下一行字符。

假设我们需要读取用户输入的一个整数,可以使用以下代码:

int num = in.nextInt();

3、解析用户输入的数据

使用Scanner对象读取用户输入的数据后,需要解析这些数据并将其转换为Java程序可以使用的数据类型。下面是一个简单的例子,从键盘读取两个数并计算它们之和:

import java.util.Scanner;

public class InputDemo{

    public static void main(String[ ] agrs){

        Scanner in = new Scanner(System.in);

        System.out.print("请输入 个数字:");

        int x = in.nextInt();

        System.out.print("请输入第二个数字:");

        int y = in.nextInt();

        int sum = x + y;

        System.out.println("它们的和是:" + sum);

    }

}

当用户输入 个数字后,程序会提示用户输入第二个数字,再计算它们的和并输出结果。

三、避免Scanner函数的异常

使用Scanner函数时,可能会出现各种异常,如NoSuchElementException、IllegalStateException、InputMisMatchException等。其中,最常见的错误是NoSuchElementException,通常是由于读取输入流时没有读取到正确的数据类型而导致的。比如上面的例子中,如果用户输入的是字符串,而不是数字,那么程序在执行nextInt()时就会出现NoSuchElementException异常。

为了避免Scanner函数的异常,可以在读取数据之前使用hasNext()方法来检查输入流是否有下一个值,并使用try-catch块来捕获异常。比如,下面的代码可以避免上述例子中可能出现的异常情况:

Scanner in = new Scanner(System.in);

    try{

        System.out.print("请输入 个数字:");

        while(!in.hasNextInt()){

            System.out.print("输入有误,请重新输入:");

            in.next();

        }

        int x = in.nextInt();

        System.out.print("请输入第二个数字:");

        while(!in.hasNextInt()){

            System.out.print("输入有误,请重新输入:");

            in.next();

        }

        int y = in.nextInt();

        int sum = x + y;        

        System.out.println("它们的和是:" + sum);

    }catch(Exception e){

        System.out.println("输入异常:" + e.getMessage());

    }

在上面的代码中,我们使用hasNextInt()方法检查输入流中是否有下一个整数,如果没有就再次提示用户输入,直到读取到正确的输入数据。使用try-catch块可以捕获用户输入错误时可能出现的异常,并输出错误信息。

四、改善Scanner函数的输入体验

在某些情况下,我们不仅要避免Scanner函数的异常,还需要改善用户的输入体验。这里我们介绍两种方法:

1、设置超时时间

当用户不再输入字符时,使用Scanner函数的next()方法会一直等待用户输入数据。可以使用useDelimiter()方法设置超时时间来避免这种情况。例如:

Scanner in = new Scanner(System.in);

    in.useDelimiter("

");

    in.hasNext();

    String str = in.next(5000);  //等待时间为5秒

使用next(5000)方法可以在超时时间(5秒)内等待用户输入,如果等待时间超过5秒,就抛出InterruptedException异常。

2、使用JLine库

JLine是一个开源库,可以提高用户在控制台中输入的体验。JLine库提供了多种特性,如行编辑、历史记录和代码补全功能等。可以通过以下方式在Java中使用JLine库:

import jline.console.ConsoleReader;

import java.io.IOException;

public class JLineDemo{

    public static void main(String[ ] agrs){

        ConsoleReader console = null;

        try{

            console = new ConsoleReader();

            String input = console.readLine("请输入你的名字: ");

            System.out.println("Hello, " + input);

        }catch(IOException e){

            System.out.println("输入错误:" + e.getMessage());

        }finally{

            if(console != null){

                console.close();

            }

        }

    }

}

在上面的代码中,我们使用ConsoleReader对象读取用户的输入,并使用readLine()方法设置输入提示信息。通过引入JLine库,可以大大改善用户的输入体验。

五、总结

Scanner函数是Java中实现用户输入的数据读取和解析的常用方法,在Java程序中使用Scanner函数可以轻松地读取、解析和处理用户从键盘或其他设备输入的数据。在使用Scanner函数时,需要注意异常处理和代码优化,为用户提供更好的输入体验。