
这篇教程非常详细了 借花献佛 :)
java控制台输入
0 引言
从控制台中读取数据是一个比较常用的功能,在 JDK 50 以前的版本中的实现是比较复杂的,需要手工处理系统的输入流。有意思的是,从 JDK 50 版本开始,能从控制台中输入数据的方法每增加一个版本号,就有一种新增的方法,这也增加了选择的种类,可以依据不同的要求来进行选择。下面来看一下,各个版本中如何从控制台中读取数据以及各自的优缺点。
1 JDK 14 及以下版本读取的方法
JDK 14 及以下的版本中要想从控制台中输入数据只有一种办法,即使用Systemin获得系统的输入流,再桥接至字符流从字符流中读入数据。示例代码如下:
import javaioIOException;
import javaioInputStreamReader;
public class Test1 {
public static void main(String[] args) {
String str = readString("请输入字符串:");
Systemoutprintln("readString 方法的输入:" + str);
}
private static String readString(String prompt) {
BufferedReader br = new BufferedReader(new InputStreamReader(Systemin));
String str = null;
try {
Systemoutprint(prompt);
str = brreadLine();
} catch (IOException e) {
eprintStackTrace();
}
return str;
}
}
从上面的代码段来看,这种控制台输入的方法非常地麻烦,为了能读取整行的数据,采用了BufferedReader类来进行处理,而且在读取的过程中还需要捕获IOException。不过这是 JDK 14 及以下版本中从控制台读取数据唯一的办法。还有一种非控制台读入数据的办法,就是采用 Swing 中的JOptionPane,会d出一个非常漂亮的输入对话框让使用者输入数据,但这是一种比较另类的做法,不推荐使用。
import javaxswingJOptionPane;
public class Test2 {
public static void main(String[] args) {
String str = readStringFromDialog("请输入字符串:");
Systemoutprintln("readStringFromDialog 方法的输入:" + str);
}
private static String readStringFromDialog(String prompt) {
return JOptionPaneshowInputDialog(prompt);
}
}
上面的两种方法都有个共同的缺点——只能读取字符串,若需要读取其他类型的数据需要手工进行转换。
2 JDK 50 读取的方法
从 JDK 50 开始,基本类库中增加了javautilScanner类,根据它的 API 文档说明,这个类是采用正则表达式进行基本类型和字符串分析的文本扫描器。使用它的Scanner(InputStream source)构造方法,可以传入系统的输入流Systemin而从控制台中读取数据。示例代码如下:
import javautilScanner;
public class Test3 {
public static void main(String[] args) {
String str = readString5("请输入字符串:");
Systemoutprintln("readString5 方法的输入:" + str);
}
private static String readString5(String prompt) {
Scanner scanner = new Scanner(Systemin);
Systemoutprint(prompt);
return scannernextLine();
}
}
从代码量上来看,Test3比Test1少了很多的代码,核心代码只有两行。其实并不是Scanner将控制台输入给简单化了,只是在其内部的实现中已经将IOException处理了,而且采用InputStreamReader来一个字符一个字符进行扫描读取的(嘿嘿,它本身就是个扫描器),只是 Scanner做了更高层次的封装。
Scanner不仅可以从控制台中读取字符串,还可以读取除char之外的其他七种基本类型和两个大数字类型,并不需要显式地进行手工转换。 Scanner不单单只能扫描控制台中输入的字符,它还可以让读入的字符串匹配一定的正则表达式模式,如果不匹配时将抛出 InputMismatchException异常。
使用Systemin作为它的构造参数时,它只扫描了系统输入流中的字符。它还有其他的构造,分别可以从文件或者是字符串中扫描分析字符串的,具体的使用方法可以参考 API 文档说明。
3 JDK 60 读取的方法
从 JDK 60 开始,基本类库中增加了javaioConsole类,用于获得与当前 Java 虚拟机关联的基于字符的控制台设备。在纯字符的控制台界面下,可以更加方便地读取数据。示例代码如下:
import javaioConsole;
import javautilScanner;
public class Test4 {
public static void main(String[] args) {
String str = readString6("请输入字符串:");
Systemoutprintln("readString6 方法的输入:" + str);
}
private static String readString6(String prompt) {
Console console = Systemconsole();
if (console == null) {
throw new IllegalStateException("不能使用控制台");
}
return consolereadLine(prompt);
}
}
在Test1和Test3中,输入数据前的提示信息需要使用Systemoutprint();来输出,但是使用基于Console的Test4类,可以在方法参数中直接放入提示信息。
如果需要在控制台中输入密码等敏感信息的话,像在浏览器或者是应用程序中那样显示替代字符,在 JDK 60 以前的做法是相当麻烦的(具体的做法可以参考《Java 编程语言中的口令屏蔽》一文),而使用Console类的readPassword()方法可以在控制台上不回显地输入密码,并将密码结果保存在char 数组中,根据 API 文档的建议,在使用后应立即将数组清空,以减少其在内存中占用的时间,以便增强安全性。
但是,Console也有一些缺点,根据ConsoleAPI 文档的说明:
虚拟机是否具有控制台取决于底层平台,还取决于调用虚拟机的方式。如果虚拟机从一个交互式命令行开始启动,且没有重定向标准输入和输出流,那么其控制台将存在,并且通常连接到键盘并从虚拟机启动的地方显示。如果虚拟机是自动启动的(例如,由后台作业调度程序启动),那么它通常没有控制台。
通过上面的文档说明可以看出,在使用 IDE 的情况下,是无法获取到Console实例的,原因在于在 IDE 的环境下,重新定向了标准输入和输出流,也是就是将系统控制台上的输入输出重定向到了 IDE 的控制台中。因此,在 IDE 中不能使用这个程序,而Test1和Test3就没有这种限制。
4 总结
以上囊括了 Java 中各种版本从控制台中读入数据的方法,将对它们的优缺点进行了分析。下面给出了一些使用建议,可供参考:
JRE 14 或以下版本的情况下,没得选择只能采用Test1或者是非控制台读入的Test2的方法。
JRE 50 的情况下,建议使用基于Scanner的Test3的方法,更方便地进行数据读取。
JRE 60 的情况,并且只在字符界面的控制台下运行时,采用Test4的方法,如果需要读入像密码之类的敏感数据,为了安全性考虑也必须使用Test4或者是自行实现。如果需要读入除字符串类型之外的其他数据类型,建议使用基于Scanner的控制台输入。
import javautilScanner;//引用Scanner包
public class Weight {
/
@param args
/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner myScanner=new Scanner(Systemin);//定义键盘接收数据
Systemoutprintln("Please input the weight:");//提示输入体重
int Weight=myScannernextInt();
Systemoutprintln("Please input the height:");//提示输入身高
int Height=myScannernextInt();
if( ((Weight/(Height-100)09)<=11) && ((Weight/(Height-100)09)>=09)){
Systemoutprintln("祝贺你,身体健康");
}else {
Systemoutprintln("你的身体处于不健康状态");
}
}
}
助人为乐是美德,自己修改,非搬运,亲测可用,望采纳~
一共 17 章
强烈建议你去买这本书!虽然电子文档很多,百度一下到处都是,但是不很方便!这本书看了真的思想都变了!!
第1章 对象入门
11 抽象的进步
12 对象的接口
13 实现方案的隐藏
14 方案的重复使用
15 继承:重新使用接口
151 改善基础类
152 等价和类似关系
16 多形对象的互换使用
161 动态绑定
162 抽象的基础类和接口
17 对象的创建和存在时间
171 集合与继承器
172 单根结构
173 集合库与方便使用集合
174 清除时的困境:由谁负责清除?
18 违例控制:解决错误
19 多线程
110 永久性
111 Java和因特网
1111 什么是Web?
1112 客户端编程
1113 服务器端编程
1114 一个独立的领域:应用程序
112 分析和设计
1121 不要迷失
1122 阶段0:拟出一个计划
1123 阶段1:要制作什么?
1124 阶段2:开始构建?
1125 阶段3:正式创建
1126 阶段4:校订
1127 计划的回报
113 Java还是C++?
第2章 一切都是对象
21 用句柄 *** 纵对象
22 必须创建所有对象
221 保存在什么地方
222 特殊情况:主类型
223 Java中的数组
23 绝对不要清除对象
231 作用域
232 对象的作用域
24 新建数据类型:类
241 字段和方法
25 方法、自变量和返回值
251 自变量列表
26 构建Java程序
261 名字的可见性
262 使用其他组件
263 static关键字
27 我们的第一个Java程序
28 注释和嵌入文档
281 注释文档
282 具体语法
283 嵌入HTML
284 @see:引用其他类
285 类文档标记
286 变量文档标记
287 方法文档标记
288 文档示例
29 编码样式
210 总结
211 练习
第3章 控制程序流程
31 使用Java运算符
311 优先级
312 赋值
313 算术运算符
314 自动递增和递减
315 关系运算符
316 逻辑运算符
317 按位运算符
318 移位运算符
319 三元if-else运算符
3110 逗号运算符
3111 字串运算符+
3112 运算符常规 *** 作规则
3113 造型运算符
3114 Java没有“sizeof”
3115 复习计算顺序
3116 运算符总结
32 执行控制
321 真和假
322 if-else
323 反复
324 do-while
325 for
326 中断和继续
327 切换
33 总结
34 练习
第4章 初始化和清除
41 由构建器保证初始化
42 方法过载
421 区分过载方法
422 主类型的过载
423 返回值过载
424 默认构建器
425 this关键字
43 清除:收尾和垃圾收集
431 finalize()用途何在
432 必须执行清除
44 成员初始化
441 规定初始化
442 构建器初始化
45 数组初始化
451 多维数组
46 总结
47 练习
第5章 隐藏实施过程
51 包:库单元
511 创建独一无二的包名
512 自定义工具库
513 利用导入改变行为
514 包的停用
52 Java访问指示符
521 “友好的”
522 public:接口访问
523 private:不能接触
524 protected:“友好的一种”
53 接口与实现
54 类访问
55 总结
56 练习
第6章 类再生
61 合成的语法
62 继承的语法
621 初始化基础类
63 合成与继承的结合
631 确保正确的清除
632 名字的隐藏
64 到底选择合成还是继承
65 protected
66 递增开发
67 上溯造型
671 何谓“上溯造型”?
68 final关键字
681 final数据
682 final方法
683 final类
684 final的注意事项
69 初始化和类装载
691 继承初始化
610 总结
611 练习
第7章 多形性
71 上溯造型
711 为什么要上溯造型
72 深入理解
721 方法调用的绑定
722 产生正确的行为
723 扩展性
73 覆盖与过载
74 抽象类和方法
75 接口
751 Java的“多重继承”
752 通过继承扩展接口
753 常数分组
754 初始化接口中的字段
76 内部类
761 内部类和上溯造型
762 方法和作用域中的内部类
763 链接到外部类
764 static内部类
765 引用外部类对象
766 从内部类继承
767 内部类可以覆盖吗?
768 内部类标识符
769 为什么要用内部类:控制框架
77 构建器和多形性
771 构建器的调用顺序
772 继承和finalize()
773 构建器内部的多形性方法的行为
78 通过继承进行设计
781 纯继承与扩展
782 下溯造型与运行期类型标识
79 总结
710 练习
第8章 对象的容纳
81 数组
811 数组和第一类对象
812 数组的返回
82 集合
821 缺点:类型未知
83 枚举器(反复器)
84 集合的类型
841 Vector
842 BitSet
843 Stack
844 Hashtable
845 再论枚举器
85 排序
86 通用集合库
87 新集合
871 使用Collections
872 使用Lists
873 使用Sets
874 使用Maps
875 决定实施方案
876 未支持的 *** 作
877 排序和搜索
878 实用工具
88 总结
89 练习
第9章 违例差错控制
91 基本违例
911 违例自变量
92 违例的捕获
921 try块
922 违例控制器
923 违例规范
924 捕获所有违例
925 重新“掷”出违例
93 标准Java违例
931 RuntimeException的特殊情况
94 创建自己的违例
95 违例的限制
96 用finally清除
961 用finally做什么
962 缺点:丢失的违例
97 构建器
98 违例匹配
981 违例准则
99 总结
910 练习
第10章 Java IO系统
101 输入和输出
1011 InputStream的类型
1012 OutputStream的类型
102 增添属性和有用的接口
1021 通过FilterInputStream从InputStream里读入数据
1022 通过FilterOutputStream向OutputStream里写入数据
103 本身的缺陷:RandomAccessFile
104 File类
1041 目录列表器
1042 检查与创建目录
105 IO流的典型应用
1051 输入流
1052 输出流
1053 快捷文件处理
1054 从标准输入中读取数据
1055 管道数据流
106 StreamTokenizer
1061 StringTokenizer
107 Java 11的IO流
1071 数据的发起与接收
1072 修改数据流的行为
1073 未改变的类
1074 一个例子
1075 重定向标准IO
108 压缩
1081 用GZIP进行简单压缩
1082 用Zip进行多文件保存
1083 Java归档(jar)实用程序
109 对象串联
1091 寻找类
1092 序列化的控制
1093 利用“持久性”
1010 总结
1011 练习
第11章 运行期类型鉴定
111 对RTTI的需要
1111 Class对象
1112 造型前的检查
112 RTTI语法
113 反射:运行期类信息
1131 一个类方法提取器
114 总结
115 练习
第12章 传递和返回对象
121 传递句柄
1211 别名问题
122 制作本地副本
1221 按值传递
1222 克隆对象
1223 使类具有克隆能力
1224 成功的克隆
1225 Objectclone()的效果
1226 克隆合成对象
1227 用Vector进行深层复制
1228 通过序列化进行深层复制
1229 使克隆具有更大的深度
12210 为什么有这个奇怪的设计
123 克隆的控制
1231 副本构建器
124 只读类
1241 创建只读类
1242 “一成不变”的弊端
1243 不变字串
1244 String和StringBuffer类
1245 字串的特殊性
125 总结
126 练习
第13章 创建窗口和程序片
131 为何要用AWT?
132 基本程序片
1321 程序片的测试
1322 一个更图形化的例子
1323 框架方法的演示
133 制作按钮
134 捕获事件
135 文本字段
136 文本区域
137 标签
138 复选框
139 单选钮
1310 下拉列表
1311 列表框
13111 handleEvent()
1312 布局的控制
13121 FlowLayout
13122 BorderLayout
13123 GridLayout
13124 CardLayout
13125 GridBagLayout
1313 action的替用品
1314 程序片的局限
13141 程序片的优点
1315 视窗化应用
13151 菜单
13152 对话框
1316 新型AWT
13161 新的事件模型
13162 事件和接收者类型
13163 用Java 11 AWT制作窗口和程序片
13164 再探早期示例
13165 动态绑定事件
13166 将商业逻辑与UI逻辑区分开
13167 推荐编码方法
1317 Java 11 UI API
13171 桌面颜色
13172 打印
13173 剪贴板
1318 可视编程和Beans
13181 什么是Bean
13182 用Introspector提取BeanInfo
13183 一个更复杂的Bean
13184 Bean的封装
13185 更复杂的Bean支持
13186 Bean更多的知识
1319 Swing入门
13191 Swing有哪些优点
13192 方便的转换
13193 显示框架
13194 工具提示
13195 边框
13196 按钮
13197 按钮组
13198 图标
13199 菜单
131910 d出式菜单
131911 列表框和组合框
131912 滑杆和进度指示条
131913 树
131914 表格
131915 卡片式对话框
131916 Swing消息框
131917 Swing更多的知识
1320 总结
1321 练习
第14章 多线程
141 反应灵敏的用户界面
1411 从线程继承
1412 针对用户界面的多线程
1413 用主类合并线程
1414 制作多个线程
1415 Daemon线程
142 共享有限的资源
1421 资源访问的错误方法
1422 Java如何共享资源
1423 回顾Java Beans
143 堵塞
1431 为何会堵塞
1432 死锁
144 优先级
1441 线程组
145 回顾runnable
1451 过多的线程
146 总结
147 练习
第15章 网络编程
151 机器的标识
1511 服务器和客户机
1512 端口:机器内独一无二的场所
152 套接字
1521 一个简单的服务器和客户机程序
153 服务多个客户
154 数据报
155 一个Web应用
1551 服务器应用
1552 NameSender程序片
1553 1553 要注意的问题
156 Java与CGI的沟通
1561 CGI数据的编码
1562 程序片
1563 用C++写的CGI程序
1564 POST的概念
157 用JDBC连接数据库
1571 获得学习示例
1572 查找程序的GUI版本
1573 JDBC API为何如何复杂
158 远程方法
1581 远程接口概念
1582 远程接口的实施
1583 创建根与干
1584 使用远程对象
1585 RMI的替选方案
159 总结
1510 练习
第16章 设计范式
161 范式的概念
1611 单子
1612 范式分类
162 观察器范式
163 模拟垃圾回收站
164 改进设计
1641 “制作更多的对象”
1642 用于原型创建的一个范式
165 抽象的应用
166 多重派遣
1661 实现双重派遣
167 访问器范式
168 RTTI有害吗
169 总结
1610 练习
第17章 项目
171 文字处理
1711 提取代码列表
1712 检查大小写样式
172 方法查找工具
173 复杂性理论
174 总结
175 练习
以上就是关于Java中如何从键盘接收一个字符全部的内容,包括:Java中如何从键盘接收一个字符、java程序,接收从键盘上输入的数据。。求解答!!、如何用java编程从键盘接收数字并运算等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)