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


Answers:


86

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

使用next()将仅返回分隔符之前的内容(默认为空白)。nextLine()返回当前行后自动向下移动扫描仪。

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

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

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

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

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


5
那么,为什么不只使用aBufferedReader逐行读取呢?我不明白为什么Scanner这么流行。
戴维·康拉德

7
@DavidConrad“ Scanner类中的next()和nextLine()方法之间有什么区别?”
Tristan 2014年

4
是的,我意识到这就是OP的要求,我只是想知道,因为您说您“总是喜欢”使用nextLine。
David Conrad 2014年

您可以安全地执行nextLine(),然后仅为该行创建一个新的Scanner。Scanner类可以扫描字符串:new Scanner(new Scanner(System.in).nextLine())。
axell13 '19

47

next()只能读取输入直到空格。它无法读取两个用空格隔开的单词。同样,next()在读取输入后,将光标置于同一行。

nextLine()读取包含单词之间的空格的输入(即,读取到行尾\n)。读取输入后,nextLine()将光标置于下一行。

要阅读整行,可以使用nextLine()


@LuiggiMendoza您的意思是格式化,不是正式的写作?
挪威

next()只能读取输入,直到空白为止。它无法读取由空格分隔的两个单词。空格包括空格,制表符和换行符
Fred Hu

18

从JavaDoc:

  • Scanner场所其输入到使用定界符模式,默认情况下与空白匹配。
  • next():查找并返回此扫描仪的下一个完整令牌。
  • nextLine():使此扫描仪前进到当前行,并返回被跳过的输入。

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


1
为什么在返回的令牌中不next()包含\n
rimalonfire

1
这是Java API设计人员的问题,或者是在SO上发布问题,也许有人知道原因。
Oleg Sklyar,

10

除了next(),我注意到的内容仅扫描到nextNext()扫描整行的最大空间是next等待直到获得完整的令牌,而nextLine()不等待完整的令牌,只要'\ n'获得(即,当您按Enter键时)扫描仪光标移至下一行并返回跳过的上一行。它不会检查您是否输入了完整的信息,即使它会接受一个空字符串,而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()来尝试该程序,继续按Enter键而不输入任何内容,您会发现使用nextLine()方法会在按给定数量的情况下终止,其中因为next()不会终止,直到您提供并输入给定数量的案例。


1
非常有趣的例子。运行代码,我终于看到了如何next()在实践中工作,它确实忽略了回车键,而将其nexLine()接受为完整的输入,并且如果您回显所捕获内容的值,则会将其复制到控制台。我刚刚System.out.println(str[i]);在下面添加了新行,str[i]=sc.next();或者str[i]=sc.nextLine();
Pablo Adames

@PabloAdames感谢您是否愿意,如果您愿意的话,可以
投票

9

关键是找到方法将在哪里停止以及调用方法后光标将在哪里。

所有方法都会读取光标位置和下一个默认定界符(空格,制表符,\ n-按Enter创建)之间不包含空格的信息。光标停在定界符之前(除外)nextLine(),该定界符读取光标位置和\ n之间的信息(包括定界符创建的空白),光标停在\ n之后。


例如,考虑下图:

|23_24_25_26_27\n

| ->当前光标位置

_ ->空格

->粗体(调用方法获得的信息)

查看调用这些方法时会发生什么:

nextInt()    

23 | _24_25_26_27 \ n

nextDouble()

阅读23_ 24 | _25_26_27 \ n

next()

阅读23_24_ 25 | _26_27 \ n

nextLine()

读取23_24_25 _26_27 \ n |


此后,应根据您的要求调用该方法。


2
这样一个被低估的答案。其他一切都有误导作用
-csguy

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),是否输入我的字符串都没有关系

输入为:-abcd abcd或

输入为:-

A B C D

A B C D

输出将像abcd

A B C D

但是,如果在同一代码中,我们将next()方法替换为nextLine()

    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(并且如果按Enter在另一行中输入下一个abcd,则输入提示符将刚刚退出,您将获得输出)

输出为:-

A B C D


2

来自javadocs

next()如果它匹配从指定字符串构造的模式,则返回下一个标记。nextLine()将此扫描程序前进到当前行之外,并返回被跳过的输入。

您选择哪一个取决于最适合您的需求。如果是我正在读取整个文件,那么我将继续进行nextLine直到拥有所有文件。


1

扫描仪的文档中:

扫描程序使用定界符模式将其输入分为令牌,默认情况下模式与空格匹配。

next()的文档中:

完整的标记在其前面,然后是与定界符模式匹配的输入。


1

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

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


1
  • 只是对于Scanner.next()和nextLine()的另一个示例,如下所示:nextLine()不允许用户键入,而next()则使Scanner等待并读取输入。

     Scanner sc = new Scanner(System.in);
    
     do {
        System.out.println("The values on dice are :");
        for(int i = 0; i < n; i++) {
            System.out.println(ran.nextInt(6) + 1);
        }
        System.out.println("Continue : yes or no");
     } while(sc.next().equals("yes"));
    // while(sc.nextLine().equals("yes"));
    

1

扫描程序使用定界符模式将其输入分为令牌,默认情况下称为空白

Next()用于读取单个单词,当它得到空白时,它将停止读取并将光标移回其原始位置。 当NextLine()遇到空格时,它会读取整个单词。光标在完成读取后停止,然后光标返回到行尾。因此,当您想将一个完整的单词作为句子阅读时,您无需使用定界符。您只需使用NextLine()。

 public static void main(String[] args) {
            // TODO code application logic here
           String str;
            Scanner input = new Scanner( System.in );
            str=input.nextLine();
            System.out.println(str);
       }

1

这两个功能都用于移至下一个扫描仪令牌。

区别在于如何生成扫描器令牌

next()使用定界符生成扫描仪令牌 空白

nextLine()使用定界符作为'\ n'生成扫描仪令牌(即,按Enter键)


0

我也遇到了有关定界符的问题。问题全是关于

  1. 输入你的名字。
  2. 输入您的年龄。
  3. 输入你的电子邮箱。
  4. 输入您的地址。

问题

  1. 我成功填写了姓名,年龄和电子邮件。
  2. 当我想到两个带有空格的单词的地址(Harnet街)时,我得到了第一个“ harnet”。

解决方案

我为扫描仪使用了定界符,并且成功退出了。

 public static void main (String args[]){
     //Initialize the Scanner this way so that it delimits input using a new line character.
    Scanner s = new Scanner(System.in).useDelimiter("\n");
    System.out.println("Enter Your Name: ");
    String name = s.next();
    System.out.println("Enter Your Age: ");
    int age = s.nextInt();
    System.out.println("Enter Your E-mail: ");
    String email = s.next();
    System.out.println("Enter Your Address: ");
    String address = s.next();

    System.out.println("Name: "+name);
    System.out.println("Age: "+age);
    System.out.println("E-mail: "+email);
    System.out.println("Address: "+address);
}

0

基本区别是next()用于获取输入直到遇到定界符(默认情况下为空白,但您也可以更改它)并返回您输入的令牌。然后光标停留在同一行上。而在nextLine()中,它将扫描输入,直到我们按下Enter键并返回整个内容,然后将光标放在下一行。**

        Scanner sc=new Scanner(System.in);
        String s[]=new String[2];
        for(int i=0;i<2;i++){
            s[i]=sc.next();
        }
        for(int j=0;j<2;j++)
        {
            System.out.println("The string at position "+j+ " is "+s[j]);
        }

**

尝试通过将Input输入为“ Hello World”来运行此代码。扫描程序读取输入直到'o',然后出现定界符。因此s [0]将为“ Hello”,光标将指向定界符之后的下一个位置(在我们的例子中是'W'),并且在读取s [1]时,它将扫描“世界”并将其返回给s [1]作为下一个完整标记(根据Scanner的定义)。如果我们使用nextLine()取而代之的是,它将完全阅读“ Hello World”,直到点击回车按钮并将其存储在s [0]中为止。我们也可以使用nextLine()给出另一个字符串。我建议您尝试使用此示例以及更多示例,并要求进行任何澄清。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.