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

时间:2014-03-17 15:34:16

标签: java java.util.scanner

next()nextLine()之间的主要区别是什么? 我的主要目标是使用Scanner来阅读所有文字,{{1}}可以“连接”到任何来源(例如文件)。

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

15 个答案:

答案 0 :(得分:64)

我总是喜欢使用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

答案 1 :(得分:35)

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

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

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

答案 2 :(得分:15)

来自JavaDoc:

  
      
  • Scanner使用分隔符模式将其输入分解为标记,分隔符模式默认匹配空格。
  •   
  • next():从此扫描仪中查找并返回下一个完整令牌。
  •   
  • nextLine():使此扫描程序超过当前行,并返回跳过的输入。
  •   

因此,如果"small example<eol>text" next()应返回“小”,nextLine()应返回“小例子”

答案 3 :(得分:7)

我注意到除了next()之外只扫描到空间,而nextLine()扫描整行,下一个等待直到它获得完整的令牌,其中 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()方法终止< / strong>在按下给定数量的情况后, next()不终止,直到您为给定数量的案例提供并输入。

答案 4 :(得分:4)

对于这个问题,关键是找到方法停止的位置以及调用方法后光标的位置。所有方法都将读取光标位置和下一个默认分隔符之间的信息(不包括空格)(空格,制表符,\ 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 |

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

答案 5 :(得分:2)

来自javadocs

next()如果匹配从指定字符串构造的模式,则返回下一个标记。 nextLine()使此扫描器前进超过当前行并返回跳过的输入。

您选择哪一个取决于哪个最适合您的需求。如果是我阅读整个文件,我会选择nextLine,直到我拥有所有文件。

答案 6 :(得分:2)

简而言之:如果您输入长度为t的字符串数组,则Scanner#nextLine()需要t行,字符串数组中的每个条目都通过输入键区别于另一个。并且扫描程序#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.next();
    }

当我在我的IDE中运行上面的代码片段时(假设字符串长度为2),我是否输入我的字符串并不重要

输入为: - abcd abcd或

输入为: -

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(如果按Enter键进入另一行的下一个abcd,输入提示将退出,你将获得输出)

输出是: -

abcd

答案 7 :(得分:1)

来自Scanner的文档:

  

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

来自next()的文档:

  

完整的标记之前和之后是与分隔符模式匹配的输入。

答案 8 :(得分: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

答案 9 :(得分: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"));
    

答案 10 :(得分:1)

扫描程序使用分隔符模式将其输入分解为标记,默认情况下称为空格

下一个()用于读取单个单词,当它获得空白时,它会停止读取并将光标恢复到原始位置。 NextLine(),即使它遇到空格,也会读取整个单词。当光标完成读取并且光标返回到行尾时,光标会停止。 所以当你想要将一个完整的单词作为一个句子阅读时,你不需要使用 delimeter 。你只需要使用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);
       }

答案 11 :(得分:1)

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

区别在于扫描器令牌的生成方式

next()使用定界符作为空白

生成扫描仪令牌

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

答案 12 :(得分:0)

我也遇到了有关分隔符的问题。 问题是关于

的输入
  1. 输入您的姓名。
  2. 输入您的年龄。
  3. 输入您的电子邮件。
  4. 输入您的地址。
  5. 问题

    1. 我成功完成了姓名,年龄和电子邮件。
    2. 当我想出两个带有空白(Harnet street)的单词的地址时,我刚拿到第一个&#34; harnet&#34;。
    3. 解决方案

      我使用分隔符作为扫描仪并成功运行。

      示例

       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);
      }
      

答案 13 :(得分: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”,并且还会读取更多内容,直到我们按下enter按钮并将其存储在s [0]中为止。 我们也可以使用nextLine()给出另一个字符串。我建议您尝试使用此示例以及更多示例,并要求进行任何澄清。

答案 14 :(得分:0)

通过下面的代码及其输出可以很明显地看出区别。

    public static void main(String[] args) {
        List<String> arrayList = new ArrayList<>();
        List<String> arrayList2 = new ArrayList<>();
        Scanner input = new Scanner(System.in);

        String product = input.next();

        while(!product.equalsIgnoreCase("q")) {
            arrayList.add(product);
            product = input.next();
        }

        System.out.println("You wrote the following products \n");
        for (String naam : arrayList) {
            System.out.println(naam);
        }

        product = input.nextLine();
        System.out.println("Enter a product");
        while (!product.equalsIgnoreCase("q")) {
            arrayList2.add(product);
            System.out.println("Enter a product");
            product = input.nextLine();
        }

        System.out.println();
        System.out.println();
        System.out.println();
        System.out.println();

        System.out.println("You wrote the following products \n");
        for (String naam : arrayList2) {
            System.out.println(naam);
        }
    }

输出:

Enter a product
aaa aaa
Enter a product
Enter a product
bb
Enter a product
ccc cccc ccccc
Enter a product
Enter a product
Enter a product
q
You wrote the following products 

aaa
aaa
bb
ccc
cccc
ccccc
Enter a product
Enter a product
aaaa aaaa aaaa
Enter a product
bb
Enter a product
q




You wrote the following products 


aaaa aaaa aaaa
bb

很清楚,默认的分隔符空格是在使用next时将空格分隔的产品添加到列表中,因此每次在一行中输入空格分隔的字符串时,它们都是不同的字符串。 对于nextLine,空格没有意义,整行是一个字符串。