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

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

我应该select哪一个,为什么?

我总是喜欢使用nextLine()读取input,然后parsingstring。

使用next()只会返回空格之前的内容。 nextLine()在返回当前行后自动向下移动扫描器。

nextLine()parsing数据的有用工具是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

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

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

nextLine()读取包含单词之间的空格(即,直到行\n结尾)的input。 一旦input被读取, nextLine()将光标定位在下一行。

为了阅读整行,你可以使用nextLine()

从JavaDoc:

  • Scanner使用分隔符模式将input分为令牌,缺省情况下符合空格。
  • next() :查找并返回来自此扫描器的下一个完整标记。
  • nextLine() :将此扫描器nextLine()到当前行之后,并返回跳过的input。

所以在"small example<eol>text" next()应该返回“small”, nextLine()应该返回“small example”

除了next()之外,我注意到除了nextLine()扫描整行的空间之外,next()还会等到它得到一个完整的标记 ,而nextLine()不会等待完整的标记, (即按Enter键)时,扫描仪光标移动到下一行,并返回跳过的上一行。 它不检查是否给出完整的input,即使它将采用一个空string,因为next()不会使用空string

  public class Stringtest { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here 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'即input键没有任何input,你可以发现,使用nextLine()方法后,按下给定数量的情况下终止next()不会终止,直到您为给定数目的个案提供并input给它。

从javadocs

next()如果它匹配从指定string构造的模式,则返回下一个标记。 nextLine()使此扫描器前进到当前行并返回跳过的input。

你select哪一个取决于你最需要的。 如果是我阅读整个文件,我会去nextline,直到我拥有了所有的文件。

简而言之,如果input的是一个长度为t的string数组,则scanner#nextLine()需要t行,string数组中的每个条目都通过回车键与另一个条目区分开来。而Scanner#next()将继续input你按下回车键,但是将string(单词)存储在数组中,用空格分隔。

让我们看看下面的代码片段

  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代码片段(让我们说的string长度2),是否input我的string作为

input为: – abcd abcd或

input为: –

A B C D

A B C D

输出将像abcd

A B C D

但是如果在相同的代码中我们用nextLine()replacenext()方法

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

然后,如果你input提示作为 – abcd abcd

输出是: –

abcd abcd

如果你input提示input为abcd(如果你按回车进入下一个abcd在另一行,input提示将会退出,你会得到输出)

输出是: –

A B C D

对于这个问题,关键是要在调用方法之后find方法停止的地方以及游标的位置。 所有方法都将读取光标位置和下一个默认分隔符(空格,制表符,\ n – 通过按Enter创build)之间的信息(不包括空格),光标在分隔符之前停止,nextLine()读取光标位置和\ n之间的信息(包括由分隔符创build的空格),光标停在\ n后面。

例如:(|表示当前的光标位置; _表示空格;以粗体显示的stream由调用方法得到的信息)

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 |

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

从扫描仪文档:

扫描器使用分隔符模式将input分为令牌, 缺省情况下符合空格。

从next()的文档:

一个完整的标记前后有与分隔符模式匹配的input。

next()和nextLine()方法与Scanner关联,用于获取stringinput。 他们的区别是…

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

nextLine()读取包含单词之间的空格(即,直到行\ n结尾)的input。 一旦input被读取,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 definputstring
c是abc

为dinputstring

d是def

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

输出:

为cinputstring

ABC DEF
c是ABC DEF
为dinputstring

GHI
d是GHI

  • 只是Scanner.next()和nextLine()的另一个例子如下所示:nextLine()不允许用户键入next()使Scanner等待并读取input。

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