【问题标题】:What's the difference between next() and nextLine() methods from Scanner class?Scanner 类的 next() 和 nextLine() 方法有什么区别?
【发布时间】:2014-04-22 21:45:40
【问题描述】:

next()nextLine() 的主要区别是什么?
我的主要目标是使用Scanner 阅读所有文本,该Scanner 可能“连接”到任何来源(例如文件)。

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

【问题讨论】:

标签: java java.util.scanner


【解决方案1】:

下面的代码和它的输出可以很明显的区别。

    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,空格没有意义,整行是一个字符串。

【讨论】:

    【解决方案2】:

    关键是要找到方法停止的地方以及调用方法后光标的位置。

    所有方法都将读取不包括光标位置和下一个默认分隔符(空格、制表符、\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()
    

    读取 23_24_25_26_27\n|


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

    【讨论】:

    • 这样一个被低估的答案。其他一切都有点误导
    【解决方案3】:

    这两个函数都用于移动到下一个 Scanner 令牌。

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

    next() 使用分隔符作为 White Space

    生成扫描器令牌

    nextLine() 使用分隔符作为 '\n' 生成扫描器令牌(即 Enter 按键)

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 那么,为什么不直接使用BufferedReader 逐行阅读呢?我不明白为什么Scanner 如此流行。
      • @DavidConrad "Scanner 类的 next() 和 nextLine() 方法有什么区别?"
      • 是的,我知道这就是 OP 所问的,我只是想知道,因为你说你“总是更喜欢”使用 nextLine。
      • 您可以安全地执行 nextLine(),然后为该行创建一个新的 Scanner。 Scanner 类可以扫描字符串:new Scanner(new Scanner(System.in).nextLine())。
      【解决方案5】:

      基本区别是 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() 给出另一个字符串。我建议您尝试使用此示例等,并要求任何澄清。

      【讨论】:

        【解决方案6】:

        我注意到除了 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() 不会终止,直到您提供并输入给定数量的情况。

        【讨论】:

        • 非常有趣的例子。运行代码我终于看到next() 在实践中是如何工作的,它确实忽略了回车键,而nexLine() 接受它作为完整的输入,如果你回显捕获的值,它会将其复制到控制台。我刚刚在str[i]=sc.next();str[i]=sc.nextLine(); 下方添加了System.out.println(str[i]); 作为新行
        • @PabloAdames 非常感谢如果你愿意,如果你可以投票回答这个问题
        【解决方案7】:

        我也遇到了关于分隔符的问题。 问题都是关于输入的

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

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            【解决方案9】:

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

            nextLine() 读取输入,包括单词之间的空格(也就是说,它读取到行尾\n)。读取输入后,nextLine() 将光标定位到下一行。

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

            【讨论】:

            • @LuiggiMendoza 你的意思是格式化,而不是正式的写作?
            • next() 只能读取输入直到 空格。它无法读取由 空格 分隔的两个单词。 空格包括空格、制表符和换行符
            【解决方案10】:

            来自 JavaDoc:

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

            所以如果"small example&lt;eol&gt;text" next() 应该返回“小”,nextLine() 应该返回“小例子”

            【讨论】:

            • 为什么next() 没有在返回的令牌中包含\n??
            • 这是给 Java API 设计者的一个问题,或者在 SO 上发布一个问题,也许有人知道原因。
            【解决方案11】:

            简而言之:如果您输入一个长度为 t 的字符串数组,那么 Scanner#nextLine() 需要 t 行,字符串数组中的每个条目都通过 enter 键与其他条目区分开来。并且 Scanner#next() 将保持输入直到您按下回车键,但将字符串(单词)存储在数组中,由空格分隔。

            让我们看看下面的sn-p代码

                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 中运行高于 sn-p 的代码时(假设字符串长度为 2),我是否输入我的字符串并不重要

            输入为:- abcd abcd or

            输入为:-

            abcd

            abcd

            输出会像 abcd

            abcd

            但是如果在相同的代码中我们将 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 (如果你按回车键在另一行输入下一个 abcd,输入提示将退出,你会得到输出)

            输出是:-

            abcd

            【讨论】:

              【解决方案12】:
              • 另一个 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"));
                

              【讨论】:

                【解决方案13】:

                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 定义
                c是abc

                为d输入字符串

                d 是定义

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

                输出:

                为 c 输入字符串

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

                GHI
                d 是 GHI

                【讨论】:

                  【解决方案14】:

                  来自Scanner 的文档:

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

                  来自next()的文档:

                  一个完整的标记前后是匹配分隔符模式的输入。

                  【讨论】:

                    【解决方案15】:

                    来自javadocs

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

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

                    【讨论】:

                      猜你喜欢
                      • 2016-06-20
                      • 1970-01-01
                      • 2011-11-05
                      • 1970-01-01
                      • 2020-08-26
                      • 2021-07-11
                      • 2010-11-06
                      • 1970-01-01
                      • 2013-02-07
                      相关资源
                      最近更新 更多