Scanner类中的next()方法和nextLine()方法有什么区别?

105
< p > next()nextLine() 的主要区别是什么?
我的主要目标是使用Scanner来读取所有文本,它可以与任何源(例如文件)进行“连接”。

我应该选择哪一个并为什么?


这可能会对你有所帮助 [使用scanner.nextLine()][1]: https://dev59.com/ym445IYBdhLWcg3wGmk6 - Milaci
15个回答

97

我总是更喜欢使用 nextLine() 读取输入,然后解析字符串。

使用 next() 只会返回分隔符(默认为空格)之前的内容。而 nextLine() 则会在返回当前行后自动将扫描器向下移动。

nextLine() 解析数据的一个有用工具是 str.split("\\s+")

String data = scanner.nextLine();
String[] pieces = data.split("\\s+");
// Parse the pieces

有关Scanner类或String类的更多信息,请参阅以下链接。

Scanner:http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

String:http://docs.oracle.com/javase/7/docs/api/java/lang/String.html


5
那么,为什么不直接使用BufferedReader逐行读取呢?我不明白为什么Scanner这么流行。 - David Conrad
7
Scanner类中的next()方法和nextLine()方法有什么区别? - Tristan
4
是的,我意识到这就是OP所问的问题,只是我想知道既然你说你“总是喜欢”使用nextLine。 - David Conrad
你可以安全地执行nextLine(),然后为该行创建一个新的Scanner。Scanner类可以扫描字符串:new Scanner(new Scanner(System.in).nextLine())。 - axell-brendow

58

next() 只能读取输入直到空格,无法读取由空格分隔的两个单词。此外,在读取输入后,next() 将光标放在同一行。

nextLine() 会读取包括单词之间的空格在内的所有输入(即,它会读取直到行末的 \n)。读取完输入后,nextLine() 会将光标定位在下一行。

如果要读取整行,可以使用 nextLine()


@LuiggiMendoza 你是指格式化,而不是正式写作吗? - Det
1
next() 只能读取输入直到空格。它无法读取由空格分隔的两个单词。空格包括空格、制表符和换行符。 - Fred Hu

19

来自JavaDoc:

  • Scanner使用分界符模式将其输入拆分为标记,默认情况下匹配空格。
  • next():查找并返回此扫描器的下一个完整标记。
  • nextLine():将此扫描器推进到当前行以及返回跳过的输入。

因此,在"small example<eol>text"的情况下,next()应返回"small",nextLine()应返回"small example"。


1
为什么 next() 函数不会在返回的标记中包含 \n - rooni
2
这是一个向Java API设计者提问的问题,或者在SO上发布一个问题,也许有人知道原因。 - Oleg Sklyar

18

关键点在于找出调用方法后,方法将停止在哪里以及光标将停留在哪里。

所有方法都会读取信息,该信息不包括光标位置和下一个默认定界符(空格、制表符、\n——通过按Enter键创建)之间的空格。光标在定界符之前停止,除了nextLine(),它会读取光标位置和\n之间(包括由定界符创建的空格)的信息,光标停在\n后面。


例如,请考虑以下说明:

|23_24_25_26_27\n

| -> 当前光标位置

_ -> 空格

stream -> 加粗(由调用方法获得的信息)

当您调用这些方法时,会发生什么?

nextInt()    

读取 23|_24_25_26_27\n

nextDouble()

阅读 23_24|_25_26_27\n

next()

读取23_24_25|_26_27\n

nextLine()

read 23_24_25_26_27\n|


完成后,应根据您的需求调用该方法。


2
这是一个被低估的答案。其他所有内容都稍微有些误导性。 - csguy

11

我注意到除了next()只扫描空格以外,nextLine()会扫描整行,next会等待直到获取完整的标记,而nextLine()不会等待完整的标记,只要获取到'\n'(即按下回车键)扫描器光标移动到下一行并返回跳过的上一行。它不检查您是否已经提供了完整的输入,甚至可以接受空字符串,而next()则不能接受空字符串。

public class ScannerTest {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int cases = sc.nextInt();
        String []str = new String[cases];
        for(int i=0;i<cases;i++){
            str[i]=sc.next();
        }
     }

}

通过更改for循环中的next()和nextLine()函数来尝试这个程序,在没有任何输入的情况下继续按'\n'即回车键,你会发现使用nextLine()方法会在按下指定数量的案例后终止,而next()函数不会终止,除非你为给定数量的案例提供了输入。


1
非常有趣的例子。运行代码后,我终于看到了 next() 如何在实践中运作,它会忽略回车键,而 nextLine() 则将其作为完整输入接受,并且如果您回显被捕获的值,则将其复制到控制台。我只是在 str[i]=sc.next();str[i]=sc.nextLine(); 下面新增了一行 System.out.println(str[i]); - Pablo Adames
@PabloAdames 如果您喜欢这个答案,感谢您的支持并点赞。 - murali kurapati

4

next()和nextLine()方法与Scanner相关,用于获取字符串输入。他们的区别是...

next()只能读取输入直到空格,无法读取由空格分隔的两个单词。此外,next()在读取输入后将光标定位在同一行。

nextLine()会读取包括单词之间的空格(即读取至行尾\n)。一旦读取完输入,nextLine()会将光标定位在下一行。

import java.util.Scanner;

public class temp
{
    public static void main(String arg[])
    {
        Scanner sc=new Scanner(System.in);
        System.out.println("enter string for c");
        String c=sc.next();
        System.out.println("c is "+c);
        System.out.println("enter string for d");
        String d=sc.next();
        System.out.println("d is "+d);
    }
}

输出:

输入字符串 c:
abc def
c 是 abc

输入字符串 d:

d 是 def

如果您使用 nextLine() 而不是 next(),那么

输出:

输入字符串 c:

ABC DEF
c 是 ABC DEF
输入字符串 d:

GHI
d 是 GHI


3
简而言之:如果您输入了一个长度为t的字符串数组,则Scanner#nextLine()期望t行,字符串数组中的每个条目都由换行键区分。而Scanner#next()将继续获取输入,直到按下Enter键,但会将单词作为字符串存储在数组中,这些单词由空格分隔开。
让我们看以下代码片段。
    Scanner in = new Scanner(System.in);
    int t = in.nextInt();
    String[] s = new String[t];

    for (int i = 0; i < t; i++) {
        s[i] = in.next();
    }

当我在我的IDE中运行上面的代码片段(假设字符串长度为2),无论我输入什么字符串,如:Input as:- abcd abcd 或 Input as:- abcd abcd,输出结果都是:
abcd
abcd
但如果我们用nextLine()方法替换next()方法,结果会发生变化。
    Scanner in = new Scanner(System.in);
    int t = in.nextInt();
    String[] s = new String[t];

    for (int i = 0; i < t; i++) {
        s[i] = in.nextLine();
    }

如果在提示符上输入以下内容-

abcd abcd

输出结果如下:

abcd abcd

如果在提示符上输入以下内容

abcd(如果你按回车键输入另一行中的下一个abcd,输入提示符将直接退出,并且你将得到输出)

输出结果如下:

abcd


2

来自Java文档

next():如果下一个标记与从指定字符串构造的模式匹配,则返回下一个标记。

nextLine():将此扫描器推进到当前行末尾并返回跳过的输入。

选择哪个方法取决于您的需求。如果我要读取整个文件,我会使用nextLine直到读完整个文件。


1

来自Scanner的文档:

扫描器使用分隔符模式将输入拆分为标记,默认情况下,分隔符模式匹配空格。

来自next()的文档:

完整的标记由与分隔符模式匹配的输入前导和后继。


1

这两个函数都用于移动到下一个扫描器标记。

区别在于扫描器标记的生成方式

next() 使用分隔符 空格 生成扫描器标记

nextLine() 使用分隔符 '\n'(即按 Enter 键)生成扫描器标记


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接