解决一个无聊的问题,如何处理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中,用户使用最多操作也是通过触摸实现点击. ...
随机推荐
- 从Gartner与IDC三大行业报告,看国产RPA的市场规模与未来发展
从Gartner与IDC三大行业报告,看国产RPA的市场规模与未来发展 Gartner与IDC的三份报告,描绘出中国RPA的市场规模与未来宏图 文/王吉伟 近期的国产RPA,可谓捷报频频.三个重量级行 ...
- Oracle实时数据抽取项目问题总结
Oracle实时数据抽取项目问题总结 项目背景介绍 项目主要是将Oracle.MySQL.SQLServer.Db2等其他数据库的实时变更数据同步到其他异构数据库中.本篇文章主要是讨论oracle的实 ...
- Jetbrains CLion 安装与激活 详解
1. 下载与安装 1.1 下载 这里提供了三个操作系统的官网下载地址 Mac Windows Linux 进入页面后向下拉点击蓝色按钮即可下载. 1.2 安装 这里将用 MacOS 来进行示例,Win ...
- Python Pandas的使用 !!!!!详解
Pandas是一个基于python中Numpy模块的一个模块 Python在数据处理和准备⽅⾯⼀直做得很好,但在数据分析和建模⽅⾯就差⼀些.pandas帮助填补了这⼀空⽩,使您能够在Python中执 ...
- 微信小程序_快速入门01
这段时间,嗯,大四课程已经结束了,工作也已经找到了,但是呢,到公司报道的时间还没到,哈哈,马上就开始人生的第一份工作了,怎么说确实有点期待~ 在这段时间一方面为第一份工作做各种准备,另一方面也没有停止 ...
- javaweb 入门
java web 我们首先来看一下两种网络服务的常用架构. C/S([Client/Server])架构 B/S架构 (Browser/Server) (这是重点) 程序完全部署在服务器上,用户通过浏 ...
- 【UE4 C++】 启动 / 关闭外部exe、开启虚拟键盘
启动/关闭外部exe 引擎自带 FPlatformProcess::CreateProc() FPlatformProcess::TerminateProc() windows api ShellEx ...
- Alpha项目展示
项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 Alpha-项目展示 我们是谁 删库跑路对不队 我们在做什么 题士 进度如何 进度总览 一.项目与团队亮点 ...
- 使用logstash的input file filter收集日志文件
使用logstash的input file filter收集日志文件 一.需求 二.实现步骤 1.前置知识 2.编写pipeline文件 3.Input 中 file 插件的部分参数解释: 4.启动l ...
- 2021.9.14考试总结[NOIP模拟53]
T1 ZYB和售货机 容易发现把每个物品都买成$1$是没有影响的. 然后考虑最后一个物品的方案,如果从$f_i$向$i$连边,发现每个点有一个出度多个入度,可以先默认每个物品都能买且最大获利,这样可以 ...