<()⽆法识别字符串中的空格
趁假期,⼜复习了⼀波Java基础语法。
获取控制台输⼊算是调试程序的⼀门重要⼿段,在Java中常见的获取控制台输⼊数据的⽅法有Scanner、输⼊流BufferedInputStream和字符流BufferedReader等等。最常⽤的还是Scanner。
以下是⼀个我之前写的⼀个简单的 Scanner 获取输⼊⽰例:
(典型错误⽰例)
Scanner input=new Scanner(System.in);
System.out.println("请输⼊id:  ");
String Int();
System.out.println("请输⼊userCode:  ");
String Line();
上述程序运⾏时,使⽤了Scanner的next()⽅法,如果输⼊带有空格字符的字段,两个字段获取的输出值就会与我们期望不⼀致。
以上代码有如下错误:
⽐如我后⾯还需要获取⼀个datetime类型的字段birthday,在mysql中是以 “yy-MM-dd HH:mm:ss” 格式存储的,⽽Scanner输⼊的对象是⼀个String类型的字符串,因此中间的空格会被 () 识别并断开,那么birthday字段就只能获取到前⾯年⽉⽇的信息,后⾯的时分秒则被过滤到下⼀个字段了。(编程序时在⽹上摸索了好久,还是⾃⼰太菜了)
原因如下:
Scanner是⼀个扫描器,它扫描数据都是去内存中⼀块缓冲区中进⾏扫描并读⼊数据的,⽽我们在控制台中输⼊的数据也都是被先存⼊缓冲区中等待扫描器的扫描读取。这个扫描器在扫描过程中判断停⽌的依据就是“空⽩符”,空格啊,回车啊什么的都算做是空⽩符。
nextInt()⽅法在扫描到空⽩符的时候会将前⾯的数据读取⾛,但会丢下空⽩符“\r”在缓冲区中,但是,nextLine()⽅法在扫描的时候会将扫描到的空⽩符⼀同清理掉。
了解了这两个⽅法特性和区别,就知道了上边的代码究竟是怎么回事,以及知道了解决的⽅法。像是
上边的代码nextInt()⽅法之后在缓冲区中留下了“\r”,然后nextLine()⽅法再去缓冲区数据的时候⾸先看到了“\r”,然后就把这个“\r”扫描接收进来,并在缓冲区内清除掉。其实,nextLine()⽅法是执⾏过的,并没有不执⾏。
解决⽅案
依据⼤佬们的说法,解决⽅法有如下两种:
nextint()方法① 将代码中的所有的()替换为Line(),即所有的分割符都以回车为基准。然后再使⽤Integer或者其他类型的parse⽅法转换为对应所需格式的数据。
② 在每个next() ⽅法后添加⼀个Line() 来吸取上⼀个input留下的分割字符,从⽽达到过滤的⽬的。
这两种⽅法都试验过,都很好⽤。
⽂笔不好多多见谅 !! :-)
前路漫漫,继续努⼒!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。