java Scanner nextLine 问题 循环使用nextLine方法
刚开始能正常读取,过两次之后就出现问题了,读取到的和输入的不一样,前面多了些字符,请看图片。相关部分代码如下:Scannerscan=newScanner(System....
刚开始能正常读取,过两次之后就出现问题了,读取到的和输入的不一样,前面多了些字符,请看图片。相关部分代码如下:Scanner scan = new Scanner(System.in); while (true) { boolean f = true; pw = new PrintWriter(new OutputStreamWriter(client.getOutputStream())); System.out.println("say something:"); String wantToSay = scan.nextLine(); System.out.println(wantToSay); if ("over to exit".equals(wantToSay)) { pw.write("结束了endFlag\n"); pw.flush(); f = false; } else { pw.write(wantToSay); pw.write("\n"); pw.write("endFlag\n"); pw.flush(); } System.out.println("waiting for receiving message");
展开
2个回答
展开全部
在实现字符窗口的输入时,我个人更喜欢选择使用扫描器Scanner,它操作起来比较简单。
在写作业的过程中,我发现用Scanner实现 字符串的输入有两种方法,一种是next(),一种
是nextLine(),但是这两种方法 究竟有什么区别呢?
我查了一些资料总结如下:
next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab、
或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法
才将其后的输入的空格键、Tab或Enter键等视为分隔符或结束符。简单地说,next()查找并返回
来自此扫描器的下一下完整标记。完整标记的前后是与分隔模式的输入信息,所以next方法不能得到
带空格的字符串。
而nextLine()方法的结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是
可以得到带空格的字符串的。
例子一:
鉴于以上两种方法的区别,同学样一定要注意next()方法 与nextLine()方法 的连用,举例如下:
package com.tarena.corejava;
import java.util.Scanner;
public class TestScanner2 {
public static void main(String[] args) {
String s1,s2;
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个字符串:");
//s1 = sc.nextLine();
s1=sc.next();
System.out.println("请输入第二个字符:");
//s2 = sc.next();
s2=sc.nextLine();
System.out.println("输入的字符串是:"+s1+" "+s2);
}
}
可以看到,nextLine()自动读取了被next()去掉的Enter作为他的结束符,所以没办法给s2键盘验证,我发现
其它的next的方法 ,如dobul nextDouble(),float next Float(),int nextInt()等与nextLine()连用时都存在
这个问题,解决办法是:在第一个next(),nextDouble(),nextFloat(),nextInt()等语句后加一个nextLine()语句,
将next()去掉的Enter结束符过滤掉,例如上面的程序改写为:
public static void main(String[] args) {
String s1,s2;
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个字符串:");
//s1 = sc.nextLine();
s1=sc.next();
sc.nextLine();
System.out.println("请输入第二个字符:");
//s2 = sc.next();
s2=sc.nextLine();
System.out.println("输入的字符串是:"+s1+" "+s2);
}
就可以了。
例子二:
package com.tarena.corejava;
import java.util.Scanner;
public class TestScanner {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("test next:输入字符串:");
String s2 = scan.next();
System.out.println("得到的字符串是:"+s2);
System.out.println("test nextLine:输入字符串:");
String s3 = scan.nextLine();
System.out.println("得到的字符串是:"+s3+"长度是:"+s3.length());
}
}
在写作业的过程中,我发现用Scanner实现 字符串的输入有两种方法,一种是next(),一种
是nextLine(),但是这两种方法 究竟有什么区别呢?
我查了一些资料总结如下:
next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab、
或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法
才将其后的输入的空格键、Tab或Enter键等视为分隔符或结束符。简单地说,next()查找并返回
来自此扫描器的下一下完整标记。完整标记的前后是与分隔模式的输入信息,所以next方法不能得到
带空格的字符串。
而nextLine()方法的结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符,它是
可以得到带空格的字符串的。
例子一:
鉴于以上两种方法的区别,同学样一定要注意next()方法 与nextLine()方法 的连用,举例如下:
package com.tarena.corejava;
import java.util.Scanner;
public class TestScanner2 {
public static void main(String[] args) {
String s1,s2;
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个字符串:");
//s1 = sc.nextLine();
s1=sc.next();
System.out.println("请输入第二个字符:");
//s2 = sc.next();
s2=sc.nextLine();
System.out.println("输入的字符串是:"+s1+" "+s2);
}
}
可以看到,nextLine()自动读取了被next()去掉的Enter作为他的结束符,所以没办法给s2键盘验证,我发现
其它的next的方法 ,如dobul nextDouble(),float next Float(),int nextInt()等与nextLine()连用时都存在
这个问题,解决办法是:在第一个next(),nextDouble(),nextFloat(),nextInt()等语句后加一个nextLine()语句,
将next()去掉的Enter结束符过滤掉,例如上面的程序改写为:
public static void main(String[] args) {
String s1,s2;
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个字符串:");
//s1 = sc.nextLine();
s1=sc.next();
sc.nextLine();
System.out.println("请输入第二个字符:");
//s2 = sc.next();
s2=sc.nextLine();
System.out.println("输入的字符串是:"+s1+" "+s2);
}
就可以了。
例子二:
package com.tarena.corejava;
import java.util.Scanner;
public class TestScanner {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("test next:输入字符串:");
String s2 = scan.next();
System.out.println("得到的字符串是:"+s2);
System.out.println("test nextLine:输入字符串:");
String s3 = scan.nextLine();
System.out.println("得到的字符串是:"+s3+"长度是:"+s3.length());
}
}
追问
答非所问啊
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询