next()
和之间的主要区别是nextLine()
什么?
我的主要目标是使用Scanner
可以“连接”到任何源(例如文件)的。
我应该选择哪一个?为什么?
Answers:
我总是喜欢使用读取输入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
这么流行。
从JavaDoc:
- 甲
Scanner
场所其输入到使用定界符模式,默认情况下与空白匹配。next()
:查找并返回此扫描仪的下一个完整令牌。nextLine()
:使此扫描仪前进到当前行,并返回被跳过的输入。
因此,在"small example<eol>text"
next()
应该返回“ small”而nextLine()
应该返回“ small example”的情况下
next()
包含\n
?
除了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()不会终止,直到您提供并输入给定数量的案例。
next()
在实践中工作,它确实忽略了回车键,而将其nexLine()
接受为完整的输入,并且如果您回显所捕获内容的值,则会将其复制到控制台。我刚刚System.out.println(str[i]);
在下面添加了新行,str[i]=sc.next();
或者str[i]=sc.nextLine();
关键是找到方法将在哪里停止以及调用方法后光标将在哪里。
所有方法都会读取光标位置和下一个默认定界符(空格,制表符,\ 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 |
此后,应根据您的要求调用该方法。
简而言之:如果您输入长度为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
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
只是对于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"));
扫描程序使用定界符模式将其输入分为令牌,默认情况下称为空白。
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);
}
这两个功能都用于移至下一个扫描仪令牌。
区别在于如何生成扫描器令牌
next()使用定界符生成扫描仪令牌 空白
nextLine()使用定界符作为'\ n'生成扫描仪令牌(即,按Enter键)
我也遇到了有关定界符的问题。问题全是关于
问题
解决方案
我为扫描仪使用了定界符,并且成功退出了。
例
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);
}
基本区别是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()给出另一个字符串。我建议您尝试使用此示例以及更多示例,并要求进行任何澄清。