【一文带你看懂Java中Scanner类中的(has)next()和(has)nextLine()的区别】

2023-12-14 23:48:09

前言:我们经常在做一些OJ题会遇到一些问题,例如hasNext()或者hasNextLine(),还有就是next()和nextLine(),如果我们用错了,通常会导致输入和输入可能有误。

hasNext()和hasNextLine()的区别

hasNext()hasNextLine()都是Java中的输入方法,他们在处理输入流时的行为不同。

hasNext()方法会判断接下来是否有非空字符,如果有非空字符,则返回true,否则返回false。

hasNextLine()方法则会检查是否还有下一行(包括空行),如果有则返回true,如果没有则返回false。

此外,这两种方法在处理输入时还会对堆空间进行操作。当它们返回一个boolean类型的结果为true时,会在堆空间中生成一个专门存放刚读取的字符串的区域,这样下次再调用next或nextLine方法时,就无需再从键盘输入,系统会自动将刚才输入的字符串原封不动地输入

举例: 假如我们有一个txt文件,文件内容有两行,如下所示:

Hello, World!

This is a test.

我们可以使用Scanner类来读取这个文件,并使用hasNext()和hasNextLine()方法来逐个读取文件中的单词和整行文本。

首先,我们需要导入java.util.Scanner包,并创建一个File对象来表示要读取的文件。然后,我们创建一个Scanner对象,并将File对象作为参数传递给它。

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        File file = new File("test.txt");
        Scanner scanner = new Scanner(file);
    }
}

接下来,我们可以使用hasNext()方法来逐个读取文件中的单词。当hasNext()返回true时,我们可以使用next()方法来获取下一个单词。?注意:我们先把next()和nextLine()用起来,下面详细介绍。

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        File file = new File("test.txt");
        Scanner scanner = new Scanner(file);
        while (scanner.hasNext()) {
            String word = scanner.next();
            System.out.println(word);
        }
    }
}

输出结果:

Hello,

World!

This

is

a

test.?

我们还可以使用hasNextLine()方法来逐行读取文件中的文本。当hasNextLine()返回true时,我们可以使用nextLine()方法来获取下一行文本。

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        File file = new File("test.txt");
        Scanner scanner = new Scanner(file);
        while (scanner.hasNextLine()) {
            String word = scanner.nextLine();
            System.out.println(word);
        }
    }
}

输出结果:

Hello, World!

This is a test.?

总结一下,hasNext()和hasNextLine()的主要区别在于它们检查的输入单元不同:前者检查的是单个标记,后者检查的是整行文本。

所以,如果你需要逐个读取每个单词,可以使用hasNext()方法;如果需要逐行读取每一行文本,就可以使用hasNextLine()方法。?

next()和nextLine()的区别

在Java中,Scanner类的next()nextLine()方法都是用来读取输入的方法,但他们在处理输入时的行为有所不同。

next()方法会读取输入中的下一个单词(以空格为分隔符)遇到空格就停止,并返回该单词。更具体地说,next()会自动消去有效字符前的空格,只返回输入的字符。

nextLine()方法则会吸取字符前后的空格/Tab键,直到遇到回车键为止。这意味着,如果输入中包含空格,nextLine()会读取包括空格在内的整行文本。

举例:模拟在控制台输入输出

1.next()

在控制台输入:themyth ?is ?ws.
输出:themyth

遇到空格就停止,空格后面的不输出

2.nextLine()

在控制台输入:themyth ?is ?ws
输出:themyth is ws

遇到回车符就停止

3.使用场景

情况1:当nextLine放在next,nextInt...nextDouble等后面

1. nextInt():18 直接回车
//上边输入的回车符会被下面的读取
2. nextLine():不能进行输入,因为nextLine()已经将上个nextInt()输入的回车符读取了。

控制台结果:

18

解决方案:

1.避免在nextLine 前写 其他的nextInt , next , nextDouble…
2.如果不可避免,写一个空的nextLine接收enter(读取上面的换行) 如下所示:

情况2: 连续两次next

1.next():themyth ws 回车
2.next():不能进行输入,因为themyth后面有空格,而next()遇到空格就停止,而这个next()读取的是空格后面的ws
控制台结果:

themyth
ws

总结:多数情况无脑用nextLine()就行了。

文章来源:https://blog.csdn.net/TheMyth142857/article/details/134999106
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。