## Java編程那些事兒89——讀取控制臺輸入
陳躍峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
### 11.3.2 讀取控制臺輸入
前面介紹了使用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;
???????? }
}
~~~
- 前言
- (1)序言
- (2)程序設計是什么?
- (3)你適合學習程序設計嗎?
- (4)如何學好程序設計?
- (5)程序設計介紹小結
- (6)計算機軟件基本概念
- (7)進制的概念
- (8)計算機內部的數據表達
- (9)網絡編程基礎
- (10)Java語言簡介
- (11)JDK的獲得、安裝和配置
- (12)第一個HelloWorld程序
- (13)Eclipse基本使用
- (14)Eclipse基礎使用進階
- (15)如何學好Java語法
- (16)代碼框架、關鍵字和標識符
- (17)基本數據類型
- (18)變量和常量
- (19)數據類型轉換
- (20)空白、語句結束和注釋
- (21)算術運算符
- (22)比較運算符
- (23)邏輯運算符
- (24)賦值運算符
- (25)位運算符
- (26)移位運算符
- (27)其它運算符
- (28)運算符優先級
- (29)表達式
- (30)流程控制基礎
- (31)if語句語法(1)
- (32)if語句語法(2)
- (33)if語句語法(3)
- (34)switch語句語法
- (35)while語句語法
- (36)do-while語句語法
- (37)for語句語法
- (38)break和continue語句
- (39)流程控制綜合示例1
- (40)流程控制綜合示例2
- (41)流程控制綜合示例3
- (42)流程控制綜合練習
- (43)數組概述
- (44)數組基礎語法
- (45)數組使用示例1
- (46)數組使用示例2
- (47)數組使用示例3
- (48)多維數組基礎
- (49)多維數組使用示例1
- (50)多維數組使用示例2
- (51)多維數組練習
- (52)方法聲明
- (53)方法聲明示例
- (54)方法調用
- (55)方法重載和參數傳遞
- (56)方法練習
- (57)面向對象基礎
- (58)類(一)
- (59)類(二)
- (60)對象
- (61)面向對象設計方法和面向對象特性(一)
- (62)繼承(二)
- (63)多態性
- (64)訪問控制符、修飾符和其它關鍵字
- (65)static修飾符
- (66)final修飾符
- (67)this和super
- (68)抽象類和接口(一)
- (69)抽象類和接口(二)
- (70)抽象類和接口(三)
- (71)內部類簡介
- (72)包的概念
- (73)JDK文檔使用
- (74)java.lang包介紹1
- (75)String類使用
- (76)StringBuffer類和System類
- (77)包裝類
- (78)時間和日期處理
- (79)Random隨機處理
- (80)集合框架簡述
- (81)異常處理概述
- (82)異常處理語法1
- (83)異常處理語法2
- (84)IO簡介
- (85)IO類體系
- (86)文件操作之File類使用
- (87)文件操作之讀取文件
- (88)文件操作之寫文件
- (89)讀取控制臺輸入
- (90)裝飾流使用1
- (91)裝飾流使用2
- (92)IO使用注意問題
- (93)多線程基礎
- (94)多線程實現方式1
- (95)多線程實現方式2
- (96)多線程使用示例1
- (97)多線程使用示例2
- (98)多線程問題及處理1
- (99)多線程問題及處理2
- (100)多線程問題及處理3
- (101)網絡編程概述
- (102)網絡編程技術1
- (103)網絡編程技術2
- (104)網絡編程技術3
- (105)網絡編程技術4
- (106)網絡編程技術5
- (107)網絡協議概念
- (108)網絡編程示例1
- (109)網絡編程示例2
- (110)網絡編程小結