JAVA读取控制台的输入【转】
前面介绍了使用IO类实现文件读写的示例,其实在很多地方还需要使用到IO类,这里再以读取控制台输入为例子来介绍IO类的使用。
控制台(Console)指无图形界面的程序,运行时显示或输入数据的位置,前面的介绍中可以使用System.out.println将需要输出的内容显示到控制台,本部分将介绍如何接受用户在控制台中的输入。
使用控制台输入是用户在程序运行时和程序进行交互的一种基础手段,这种手段是Windows操作系统出现以前,操作系统位于DOS时代时,用户和程序交互的主要手段。当然,现在这种交互的方式已经被图形界面(GUI)程序取代了。
在读取控制台操作中,操作系统在用户在控制台输入内容,并按回车键提交以后,将用户提交的内容传递给Java运行时系统,Java运行时系统将用户输入的信息构造成一个输入流对象——System.in,在程序员读取控制台输入时,只需要从该流中读取数据即可。至于构造流System.in的过程对于程序员来说是透明的。
查阅JDK API可以发现,System类中的静态属性in是InputStream类型的对象,可以按照输入流的读取方法读取即可。
下面的示例代码实现了输入“回显”的功能,即将用户输入的内容重新显示到控制台,示例代码如下:
/**
* 读取控制台输入,并将输入的内容显示到控制台
*/
public class ReadConsole1 {
public static void main(String[] args) {
try{
//提示信息
System.out.println("请输入:");
//数组缓冲
byte[] b = new byte[1024];
//读取数据
int n = System.in.read(b);
//转换为字符串
String s = new String(b,0,n);
//回显内容
System.out.println("输入内容为:" + s);
}catch(Exception e){}
}
}
在该示例代码中,从System.in中读取出用户的输入,然后将用户输入的内容转换为字符串s,然后输出该字符串的内容即可。
下面实现一个简单的逻辑,功能为:回显用户在控制台输入的内容,当用户输入quit时程序运行结束。实现的代码如下:
/**
* 读取控制台输入
* 循环回显内容,当输入quit时退出程序
*/
public class ReadConsole2 {
public static void main(String[] args) {
//数组缓冲
byte[] b = new byte[1024];
//有效数据个数
int n = 0;
try{
while(true){
//提示信息
System.out.println("请输入:");
//读取数据
n = System.in.read(b);
//转换为字符串
String s = new String(b,0,n - 2);
//判断是否是quit
if(s.equalsIgnoreCase("quit")){
break; //结束循环
}
//回显内容
System.out.println("输入内容为:" + s);
}
}catch(Exception e){}
}
}
在该示例代码中,加入了一个while循环,使得用户的输入可以进行多次,在用户输入时,送入输入流的内容除了用户输入的内容以外,还包含”\r\n”这两个字符,所以在将输入的内容和quit比较时,去掉读出的最后2个字符,将剩余的内容转换为字符串。
最后是一个简单的《掷骰子》的控制台小游戏,在该游戏中,玩家初始拥有1000的金钱,每次输入押大还是押小,以及下注金额,随机3个骰子的点数,如果3个骰子的总点数小于等于9,则开小,否则开大,然后判断玩家是否押对,如果未押对则扣除下注金额,如果押对则奖励和玩家下注金额相同的金钱。该程序的示例代码如下:
/**
* 掷骰子游戏实现
*/
public class DiceGame {
public static void main(String[] args) {
int money = 1000; //初始金钱数量
int diceNum = 0; // 掷出的骰子数值和
int type = 0; // 玩家押的大小
int cMoney = 0; // 当前下注金额
boolean success; // 胜负
// 游戏过程
while (true) {
// 输入大小
System.out.println("请押大小(1代表大,2代表小):");
type = readKeyboard();
// 校验
if (!checkType(type)) {
System.out.println("输入非法,请重新输入!");
continue;
}
// 输入下注金额
while(true){
System.out.println("你当前的金钱数量是"
+ money + "请下注:");
cMoney = readKeyboard();
// 校验
if (!checkCMoney(money,cMoney)) {
System.out.println("输入非法,请重新输入!");
continue;
}else{
break;
}
}
// 掷骰子
diceNum = doDice();
// 判断胜负
success = isSuccess(type,diceNum);
// 金钱变化
money = changeMoney(money,success,cMoney);
// 游戏结束
if(isEnd(money)){
System.out.println("你输了,bye!");
break;
}
}
}
/**
* 读取用户输入
* @return 玩家输入的整数,如果格式非法则返回0
*/
public static int readKeyboard() {
try {
// 缓冲区数组
byte[] b = new byte[1024];
// 读取用户输入到数组b中,
// 读取的字节数量为n
int n = System.in.read(b);
// 转换为整数
String s = new String(b, 0, n - 2);
int num = Integer.parseInt(s);
return num;
} catch (Exception e) {}
return 0;
}
/**
* 押的类型校验
* @param type 类型
* @return true代表符合要求,false代表不符合
*/
public static boolean checkType(int type) {
if (type == 1 || type == 2) {
return true;
} else {
return false;
}
}
/**
* 校验下注金额是否合法
* @param money 玩家金钱数
* @param cMoney 下注金额
* @return true代表符合要求,false代表不符合要求
*/
public static boolean checkCMoney(int money, int cMoney) {
if (cMoney <= 0) {
return false;
} else if (cMoney <= money) {
return true;
} else {
return false;
}
}
/**
* 掷骰子
* @return 骰子的数值之和
*/
public static int doDice() {
int n = (int) (Math.random() * 6) + 1;
int n1 = (int) (Math.random() * 6) + 1;
int n2 = (int) (Math.random() * 6) + 1;
// 输出随机结果
System.out.println("庄家开:" + n + " " + n1 + " " + n2);
return n + n1 + n2;
}
/**
* 胜负判断
* @param type 用户输入类型
* @param diceNum 骰子点数
* @return true代表赢,false代表输
*/
public static boolean isSuccess(int type, int diceNum) {
// 计算庄家类型
int bankerType = 0;
if (diceNum <= 9) {
bankerType = 2;
System.out.println("庄家开小!");
} else {
bankerType = 1;
System.out.println("庄家开大!");
}
if (bankerType == type) { // 赢
return true;
} else { // 输
return false;
}
}
/**
* 金钱变化
* @param money 用户钱数
* @param success 胜负
* @param cMoney 下注金额
* @return 变化以后的金钱
*/
public static int changeMoney(int money, boolean success, int cMoney) {
if (success) {
money += cMoney;
} else {
money -= cMoney;
}
System.out.println("剩余金额:" + money);
return money;
}
/**
* 判断游戏是否结束
* @param money 玩家金钱
* @return true代表结束
*/
public static boolean isEnd(int money) {
return money <= 0;
}
}
JAVA读取控制台的输入【转】的更多相关文章
- Java 读取控制台输入
方式1:InputStreamReader+BufferedReader package my_package; import java.io.BufferedReader; import java. ...
- Java从控制台接受输入字符
创建一个类,在该类的主方法中创建Scanner扫描起来封装System类的in输入流,然后提示用户输入身份证号码,并输入身份证号码的位数. 代码如下: import java.util.Scanner ...
- Java读取文件-BufferedReader/FileReader/InputStreamReader/FileInputStream的关系和区别
一.Java读取和存储文件数据流 Java读取文件,实际是将文件中的字节流转换成字符流输出到屏幕的过程 这里面涉及到两个类:InputStreamReader和OutputStreamWriter ...
- (六)read读取控制台输入
1.基本语法 read(选项)(参数) 选项: -p:指定读取值时的提示符: -t:指定读取值时等待的时间(秒). 参数 变量:指定读取值的变量名 2.案例实操 (1)提示7秒内,读取控制台输入的名称 ...
- java 获取控制台输入
读取控制台输入 从控制台读取一行数据,返回值字符串 public class IO { public static void main(String args[]) throws IOExceptio ...
- Shell 脚本(四) ”read 读取控制台输入” 与 “函数”
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 八.read 读取控制台输入 1.基本语法 read(选项)(参数) 选项: -p: 指定读取值时的提示 ...
- shell专题(八):read读取控制台输入
1.基本语法 read(选项)(参数) 选项: -p:指定读取值时的提示符: -t:指定读取值时等待的时间(秒). 参数 变量:指定读取值的变量名 2.案例实操 (1)提示7秒内,读取控制台输入的名称 ...
- 编写Java程序,应用客户端和服务端通过 Eclipse 控制台的输入和显示实现简易的聊天功能
查看本章节 查看作业目录 需求说明: 应用客户端和服务端通过 Eclipse 控制台的输入和显示实现简易的聊天功能 实现思路: 创建 Java 项目,在项目中创建服务端类 ChatServerThre ...
- linux实操_shell读取控制台输入
基本语法: read [选项] [参数] 选项: -p 指定读取值时的提示符 -t 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了 参数: 变量:指定读取值的变量名 实例1:读 ...
随机推荐
- 环境无法创建目录,提示Too many links
业务流程需要从客户端下载文件到本地临时目录,然后再解压文件写入相应文件后压缩,现在发现第一步创建本地临时目录就失败了. 去环境上用df命令一看,磁盘分区空间已用99%,还没到100%应该是没问题的.再 ...
- android中HttpClient的应用(POST方法)
首先在http://hc.apache.org/downloads.cgi下载HttpClient包 直接看代码 import android.os.Handler; import android.o ...
- shell查看执行过程及时间变量
sh -xv test.sh #加参数xv查看shell执行过程. Shell 调用系统时间变量 获取今天时期:`date +%Y%m%d` 或 `date +%F` 或date +%Y-%m- ...
- Appium+python自动化29-toast消息(亲测 ok)
本篇转自博客:上海-悠悠 前言 appium1.5以后的版本才支持toast定位,并且 'automationName'得设置为'Uiautomator2',才能捕获到. 一. Supported P ...
- Java-Runoob:Java 变量类型
ylbtech-Java-Runoob:Java 变量类型 1.返回顶部 1. Java 变量类型 在Java语言中,所有的变量在使用前必须声明.声明变量的基本格式如下: type identifie ...
- VC散列表
vc下有2个版本的散列表类,hash_map和unordered_map,hash_map位于stdext命名空间,unordered_map在std命名空间(vs2008及其之后的版本可用),官方推 ...
- Arp内网毒化
攻击者:192.168.220.143 受害者:192.168.220.137 默认网关:192.168.220.2 首先,开启IP转发 使用工具Arpspoof进行ARP毒化,把受害者的流量传送给网 ...
- VMWARE 虚拟机新增硬盘,格式化分区,并挂载
VMWARE 虚拟机新增 硬盘 并挂载 一台虚拟机上安装ORACLE12c 需要分一块硬盘挂载数据文件 日志文件 以及归档文件 1. 关闭虚拟机 2. 编辑虚拟机设置 选择[编辑虚拟机设置]并打开,将 ...
- 关于苹果safari浏览器登陆时Cookie无法保存的问题
前段时间,修改了登录处理后给到客户端浏览器Cookie的内容,新增了一个姓名的value,发现safari不能保存该Cookie的内容,同时Chrome.firefox.ie等浏览器都能正常的访问,直 ...
- uboot重定位代码分析(转)
概述 重定位(relocate)代码将BootLoader自身由Flash复制到SDRAM,以便跳转到SDRAM执行.之所以需要进行重定位是因为在Flash中执行速度比较慢,而系统复位后总是从0x00 ...