解决一个无聊的问题,如何处理Java用户在dos被收集信息时拷贝带换行符的文本信息造成的while的多次循环(java解决Scanner.next在接收用户输入时出现多个换行的形况)[解决方案一]
问题描述:
用户在dos窗口输入的时候(web项目不会出现这样的问题,所以这个问题日常碰不到),摁下回车时,Scanner对象的next()扫描用户输入的文本,后面就可以根据输入的字符串进行判断,并执行以后的处理,但是,如果用户选择从别的地方粘,并且是多行的那种
比如:

此时的字符后面回跟上回车符,整体的逻辑又在循环里面进行判断,就会导致自己没动,代码已经跑了换行数量的遍数,这里我写一个简易的demo,演示一下
1 public static void main(String[] args) {
2 Scanner sc = new Scanner(System.in);
3 String choose;
4 while (true){
5 long l1 = System.currentTimeMillis();
6 System.out.println("请输入您的年龄");
7 choose = sc.next();
8
9 System.out.println("成功录入执行的代码"+choose);
10 }
11 }
// 为什么要用while循环套着?因为要做类型转换异常后的continue
输入和输出的结果
请输入您的年龄
asdsa
sadas
sadasasdasd
asdas
成功录入执行的代码asdsa
请输入您的年龄
成功录入执行的代码sadas
请输入您的年龄
成功录入执行的代码sadasasdasd
请输入您的年龄
成功录入执行的代码asdas
请输入您的年龄
此时这就不是我们想要的一个效果,或者进行一个逻辑的修改,一下子录入全部的信息,也不是问题,这里先说第一种解决方法,就是只录最后一次输入的,让它自动录入到最后一行(录入第一行的我也试过了,无法实现,有大神能给出解决方案吗)
// 这是我想要录入第一行的代码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String choose;
String temp;
while (true) {
long l1 = System.currentTimeMillis();
System.out.println("请输入您的年龄");
choose = sc.next();
while (true) {
temp = sc.next();
long l = System.currentTimeMillis();
if(l - l1 > 3){
System.out.println("正常");
break;
} else {
continue;
}
}
System.out.println("成功录入执行的代码" + choose);
}
}
// 代码到解决思路中讲解
输入和输出的结果
请输入您的年龄
asdsa
sadas
sadasasdasd
asdas
正常
成功录入执行的代码asdsa
请输入您的年龄
1
正常
成功录入执行的代码sadasasdasd
请输入您的年龄
1
1
正常
成功录入执行的代码1
请输入您的年龄
// 此时多次输入可以成功,但用户单次输入就要输入两次,用户体验不佳
解决思路:
因为用户输入得文本包含回车符,所以相当于输入后按了个回车,导致它自己会不停的自动录入,所以我们要先确定用户输入的一定得是一行,如果包含多行,要想办法把它给消失掉,要把这个逻辑搞明白,(如有新手有不太理解得可以在评论区与我讨论)
下面开始想办法消除多余的数据,一开始我是想用while循环不停录入,直到录入为空,显然这个逻辑不行,我又开始想第二种方法,这时我想到可以用时间来判断,调用Java的
System.currentTimeMillis(); // 此方法可以获取当前时间的毫秒数,又在我多次测试后发现,中间间隔最大不会超过3,老电脑不一定了
可以在录入前记录一次时间,录入完场后再记录一次时间,时间大于3毫秒的,我们认为它是正常录入,正常执行代码并接收,如果不是就continue回去再次扫描,因为我们可以认为用户是违法输入,人手一般输入干不进3毫秒,有了想法思路后就可以进行代码的编写了
1 public static void main(String[] args) {
2 Scanner sc = new Scanner(System.in);
3 // 用来接收用户输入的文本
4 String choose;
5 int age;
6 // 循环录入,如果转换出错的话
7 while (true) {
8 // 输出提示信息
9 System.out.println("请输入您的年龄");
10 // 记录录入前的时间
11 long l1 = System.currentTimeMillis();
12 // 开始循环判断是否为不正常输入输入
13 while (true) {
14 // 录入用户输入的信息
15 choose = sc.next();
16 // 记录录入结束的时间
17 long l = System.currentTimeMillis();
18 // 开始进行逻辑判断,是否是正常输入
19 // 正常输入的话时间一定是大于3毫秒的
20 if (l - l1 > 3) {
21 // 正常录入进入正常的代码段
22 System.out.println("正常的录入方式");
23 // 退出当前录入的循环
24 break;
25 } else {
26 continue;
27 }
28 }
29 // 退出录入循环 进入类型转换
30 try {
31 // 如果转换正常开始输出信息
32 age = Integer.valueOf(choose);
33 } catch (NumberFormatException e) {
34 // 转换出现异常,continue回去让用户重新输入
35 System.out.println("输入有误,请输入数字!");
36 continue;
37 }
38 // 输出正常的信息
39 System.out.println("成功录入执行的代码" + choose);
40 // 结束程序
41 return;
42 // 当然这是个小demo的演示,年龄判断的逻辑没有写
43 }
44 }
输入和输出的结果
请输入您的年龄
asdsa
sadas
sadasasdasd
asdas
正常的录入方式
输入有误,请输入数字!
请输入您的年龄
15
正常的录入方式
成功录入执行的代码15 Process finished with exit code 0
此时这个不算BUG的BUG已经解决了
System.currentTimeMillis
解决一个无聊的问题,如何处理Java用户在dos被收集信息时拷贝带换行符的文本信息造成的while的多次循环(java解决Scanner.next在接收用户输入时出现多个换行的形况)[解决方案一]的更多相关文章
- 将html中的br换行符转换为文本输入中的换行符(转)
PHP中的有个非常好的函数:nl2br(),将文本框中的换行转换为HTML页面的<br />,但是如何实现将html中的<br />换行符转换为文本框中的换行符呢?下面这几个方 ...
- php函数nl2br的反函数br2nl 将html中的br换行符转换为文本输入中的换行符
下面这几个方法将能够帮你解决这个问题. PHP版将html中的<br />换行符转换为文本框中的换行符: 代码如下: function br2nl($text){ return preg_ ...
- 换行符在ajax中返回json,eval时发生的 Unexpected token ILLEGAL
用户如果输入了换行在数据中记录为‘空格’,但不是真正的空格. 程序前台采用ajax和json返回数据绑定时会 出现 Unexpected token ILLEGAL 例子: 在sql中存储为下图 在“ ...
- 【转载】Java中的回车换行符/n /r /t
source:http://hane00.blog.163.com/blog/static/1600615220126204446809/ '\r'是回车,'\n'是换行,前者使光标到行首,后者使光标 ...
- 第4章 Java接收用户输入
第4章 Java接收用户输入 1.输入 使用Scanner工具类可以换取用户输入的数据Scanner类位于java.util包中,使用时需要导入此包使用步骤: 1.导入java.util.Scanne ...
- 键盘接收用户输入案例2(案例内容包含键盘接收 int、String、Char、double、boolean)等类型及介绍
int类型: int age = input.nextInt(); double类型: double score = input.nextDouble(); String类型: String n ...
- C#入门教程(三)–接收用户输入、转义字符、类型转换-打造C#入门教程
上次教程主要讲解了visual stdio快捷键.变量相关的知识.具体教程戳这里:http://www.chengxiaoxiao.com/net/1027.html 越来越深入去写教程越来越发现,自 ...
- 03-java学习-基本数据类型-运算符-键盘接收用户输入
java的八大基本数据类型: 类型转换的基本原则: java整数的默认类型是int,小数的默认类型是double 运算符: 算术运算符.连接.赋值.关系.逻辑.三目运算符等…… 键盘接收用户输入: j ...
- Xamarin iOS教程之使用按钮接接收用户输入
Xamarin iOS教程之使用按钮接接收用户输入 Xamarin iOS使用按钮接接收用户输入 按钮是用户交互的最基础控件.即使是在iPhone或者iPad中,用户使用最多操作也是通过触摸实现点击. ...
随机推荐
- .Net Core 实现 自定义Http的Range输出实现断点续传或者分段下载
一.Http的Range请求头,结合相应头Accept-Ranges.Content-Range 可以实现如下功能: 1.断点续传.用于下载文件被中断后,继续下载. 2.大文件指定区块下载,如视频.音 ...
- 干货 | 数据为王,携程国际火车票的 ShardingSphere 之路
以下文章来源于携程技术 ,作者瑞华 作者简介 瑞华,携程高级后端开发工程师,关注系统架构.分库分表.微服务.高可用等. 一.前言 随着国际火车票业务的高速发展,订单量快速增长,单数据库瓶颈层面的问题逐 ...
- 开发数学系统时,需要掌握的几个基于Web的数学框架
在做数学系统时,经常要和数学公式打交道,这里介绍几个常用的基于Web的数学处理软件. 数学系统主要包括三类:(1)数学公式的显示,也就是如何使用web显示复杂的数学公式. (2)图像制作,例如长方形, ...
- Idea进行java应用的远程调试Remote debugging
本文可以解决如下两个问题: 1.如何处理和调试那些只发生在生产环境(或其他远程环境)而本地开发环境可能没办法重现的"问题". 2.只有一个可以部署的war/jar包,只有class ...
- 原生js-返回顶部
html部分: <body style="height:2000px"> <div id="div1"> 返回顶部 </div&g ...
- 敏捷 Scrum Master 的難點
什麼是 Scrum Master? Scrum master 是一個團隊角色,負責確保團隊遵守敏捷方法和原則並符合團隊的流程和實踐. Scrum Master 促進敏捷開發團隊成員之間的協作.Scru ...
- Java版人脸检测详解下篇:编码
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Java:阻塞队列
Java:阻塞队列 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. 概述 概念 队列 队列就可以想成是一个数组,从一头进入,一头出去,排队买饭 阻塞队列 B ...
- rocketMQ(一)基础环境
一.安装: http://rocketmq.apache.org/dowloading/releases/ https://www.apache.org/dyn/closer.cgi?path=roc ...
- 防止SQL注入总结
1.预编译(占位符)可以很大程度上防止SQL注入 预编译的原理是数据库厂商提供的JAR包中,对参数进行了转义 2.mybatis中,能用# 的地方,不用$,因为#是预编译占位符形式,可以防止SQL注入 ...