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