Java学习笔记(十)--控制台输入输出
輸入輸出
一、控制臺輸入
在程序運行中要獲取用戶的輸入數據來控制程序,我們要使用到 java.util 包中的 Scanner 類。當然 Java 中還可以使用其他的輸入方式,但這里主要講解 Scanner 類方法。關于 Scanner 類我們可以直接通過了解它的 API 文檔來使用它。
Scanner 類定義在 java.util 包中。當使用的類不是定義在基本 java.lang 包中時,一定要使用 import 關鍵字導入相應的包。
要通過控制臺進行輸入,首先需要構造一個 Scanner 對象,并與 “標準輸入流” System.in 關聯。
Scanner in = new Scanner(System.in);構造完對象之后,我們就可以使用 Scanner 類的各種方法來實現輸入操作了。
1.1 獲取字符串
使用 Scanner 類的 next() 與 nextLine() 方法獲取輸入的字符串。在讀取前我們一般需要 使用 hasNext 與 hasNextLine 判斷緩沖區是否有輸入的數據,返回值為布爾值。
1、String next()
讀取輸入的第一個單詞(以空格作為分隔符)
String str = in.next();- 一定要讀取到有效字符后才可以結束輸入。
- 對輸入有效字符之前遇到的空白,next() 方法會自動將其去掉。
- 只有輸入有效字符后才將其后面輸入的空白作為分隔符或者結束符。
接收到一個數據之后,空白之后的其他內容即將繼續存在緩存中。一定要將緩存區的內容處理,否則會影響后面的輸入接收。
2、String nextLine()
讀取輸入的一行內容。
String str = in.nextLine();- 以Enter為結束符,也就是說 nextLine()方法返回的是輸入回車之前的所有字符。字符串允許包含空格。
1.2 讀取數字
如果要輸入整型或浮點型的數據,在 Scanner 類中也有支持,但是在輸入之前最好先使用 hasNextXxx() 方法(返回值為布爾類型)進行輸入的類型驗證,再使用 nextXxx() 來讀取。
想要讀取一個整數,可以調用 nextInt() 方法。
int i = in.nextInt();與此類似,想要讀取浮點數可以使用 nextDouble() 方法。更多方法請自行閱讀 Scanner 類方法。
1.3 讀取密碼
因為輸入是可見的,所以 Scanner 類不適用于從控制臺讀取密碼。我們可以使用 Console 類來實現這個目的。
Console cons = System.console(); String username = cons.readLine("User name: "); char[] passwd = cons.readPassword("PassWord: ");為了安全起見,返回的密碼存放在一個一維數組中,而不是字符串中。在對密碼進行處理之后,應該馬上用一個填充值覆蓋數組元素。
例:實現獲取用戶名和密碼,并將其打印出來。
import java.io.Console;public class TestConsole {public static void main(String[] args) {Console cons = System.console();String username = cons.readLine("User name: ");char[] passwd = cons.readPassword("PassWord: ");System.out.println("User name: " + username);System.out.println("PassWord: " + String.valueOf(passwd));} }運行結果
注意:java.io.Console 只能用在標準輸入、輸出流未被重定向的原始控制臺中使用,在 Eclipse 或者其他 IDE 的控制臺無法使用。
1.4 關于緩沖區問題
在控制臺輸入數據時,如果輸入的內容類型與接收預設的類型不一致,將拋出錯誤并終止程序。可以其他方法檢測或跳過可能出錯的語句。
如果使用 hasNextXx() 方法判斷輸入的類型,用戶輸入的內容還是存在緩存中,直到將數據接收或程序終止??梢酝ㄟ^ nextLine() 方法將緩存中的內容接收,以達到清空緩沖區中的內容。也可以重新構造原來的 Scanner 對象。
import java.util.*; public class First {public static void main(String[] args) {Scanner scan = new Scanner(System.in);// 從鍵盤接收數據int i = 0;float f = 0.0f;scan = new Scanner(System.in);System.out.print("輸入整數:");if (scan.hasNextInt()) {// 判斷輸入的是否是整數i = scan.nextInt();// 接收整數System.out.println("整數數據:" + i);} else {// 輸入錯誤的信息System.out.println("輸入的不是整數!");scan.nextLine(); // 處理緩存區內容//或者 scan = new Scanner(System.in);}System.out.print("輸入小數:");if (scan.hasNextFloat()) {// 判斷輸入的是否是小數f = scan.nextFloat();// 接收小數System.out.println("小數數據:" + f);} else {// 輸入錯誤的信息System.out.println("輸入的不是小數!");}scan.close();} }二、控制臺輸出
2.1 常用輸出方法
控制臺輸出可以使用 System.out.print() ,System.out.printf() , System.out.println() 等方法。
- System.out.println():是最常用的輸出語句,它會把括號里的內容轉換成字符串輸出到輸出窗口(控制臺),并且換行,當輸出的是一個基本數據類型時,會自動轉換成字符串,如果輸出的是一個對象,會自動調用對象的toString();方法,將返回值輸出到控制臺。
- System.out.print():與第一個很相似,區別就是上一個輸出后會換行,而這個命令輸出后并不換行。
- System.out.printf():通過格式化文本和參數列表輸出。
2.2 格式化輸出
輸出格式化數字可以使用 printf() 和 format() 方法。
使用 System.out.printf() 方法在控制臺上顯示格式化輸出。
System.out.printf(format, item1, item2, ..., itemn);這里的 format 是指一個由子串和格式說明符構成的字符串。格式說明符指定每個條目應該如何顯示。這里的條目可以是數值、字符、布爾值或字符串。簡單的格式說明符是以百分號 (%) 開頭的轉換碼。
2.2.1 用于 printf 的轉換符
| d | 十進制整數 | 159 |
| x | 十六進制整數 | 9f |
| o | 八進制整數 | 237 |
| f | 定點浮點數 | 15.9 |
| e | 指數浮點數 | 1.59e+01 |
| g | 通用浮點數 | - |
| a | 十六進制浮點數 | 0x1.fccdp3 |
| s | 字符串 | Hello |
| c | 字符 | H |
| b | 布爾 | True |
| h | 散列碼 | 42628b2 |
| tx | 日期時間 | x見下 |
| % | 百分號 | % |
| n | 與平臺有關的行分隔符 | - |
2.2.2 用于 printf 的標志
| + | 打印正數和負數的符號 | +3333.33 |
| 空格 | 在正數之前添加空格 | | 3333.33| |
| 0 | 數字前面補0 | 003333.33 |
| - | 左對齊 | |3333.33 | |
| ( | 將負數括在括號內 | (3333.33) |
| , | 添加分組分隔符 | 3,333.33 |
| #(對于f格式) | 包含小數點 | 3333.33 |
| #(對于x或0格式) | 添加前綴0x或0 | 0xcafe |
| $ | 給定被格式化的參數索引。如%1$d將以十進制打印第一個參數 | |
| < | 格式化前面說明的數值。如%d%<x以十進制和十六進制打印同一個數值 |
2.2.3 時間和日期的轉換符
在這里,使用以 t 開始,格式為 tx,x代表的內容如下表:
| c | 完整的日期和時間 | 周日 4月 19 11:51:37 CST 2020 |
| F | ISO 8601 日期 | 2020-04-19 |
| D | 美國格式的日期(月/日/年) | 04/19/20 |
| T | 24小時時間 | 11:56:27 |
| r | 12小時時間 | 11:57:05 上午 |
| R | 24小時時間沒有秒 | 11:56 |
| Y | 4位數字的年 | 2020 |
| y | 年的后兩位數字 | 20 |
| C | 年的前兩位數字 | 20 |
| B | 月的完整拼寫 | February |
| b或h | 月的縮寫 | Feb |
| m | 兩位數字的月 | 04 |
| d | 兩位數字的日(前面補0) | 09 |
| e | 兩位數字的日(前面不補0) | 9 |
| A | 星期幾的完整拼寫 | Monday |
| a | 星期幾的縮寫 | Mon |
| j | 三位數的年中的日子(前面補0),在001到366之間 | 069 |
| H | 兩位數字的小時(前面補0),0到23之間 | 12 |
| k | 兩位數字的小時(前面不補0),0到23之間 | 12 |
| I(i的大寫) | 兩位數字的小時(前面補0),0到12之間 | 06 |
| l(L的小寫) | 兩位數字的小時(前面不補0),0到12之間 | 6 |
| M | 兩位數字的分鐘(前面補0) | 05 |
| S | 兩位數字的秒(前面補0) | 19 |
| L | 三位數字的毫秒(前面補0) | 047 |
| N | 九位數字的毫微秒(前面補0) | 020000000 |
| P | 上午或下午的大寫標志 | PM |
| p | 上午或下午的小寫標志 | am |
| z | 從GMT起,RFC822數字位移 | +0800 |
| Z | 時區 | CST |
| s | 從格林威治時間1970-01-01 00:00:00 起的秒數 | 1587270316 |
| Q | 從格林威治時間1970-01-01 00:00:00 起的毫秒數 | 1587270331450 |
2.2.4 使用參數索引格式化輸出日期
Date date = new Date();System.out.printf("%1$s %2$tB%2$te日, %2$tY","data:",date); //輸出結果為 data: 四月19日, 2020索引必須緊跟在%后面,并以$終止。參數索引值從1開始,而不是從0開始。
同樣還可以使用 < 標志。它指示前面格式說明中的參數將再次使用。
System.out.printf("%s %tB%<te日, %<tY","data:",date);2.2.5 指定寬度和精度
| %5c | 輸出字符并在這個字符條目前面加4個空格 |
| %6b | 輸出布爾值,在false值前加一個空格,在true值前加兩個空格 |
| %5d | 輸出整個條目,寬度至少為5.如果該條目的數字位數小于5,就在數字前面加空格.如果該條目的位數大于5,則自動增加寬度 |
| %10.2f | 輸出的浮點條目寬度至少為10,包括小數點、和小數點后兩位數字.這樣,給小數點前分配了7位數字. 如果該條目小數點前的位數小于7,就在數字前面加空格. 如果該條目小數點前的位數大于7,則自動增加寬度. |
| %10.2e | 輸出的浮點條目的寬度至少為10,包括小數點、小數點后面兩位數字和指數部分.如果按科學計數法顯示的數字位數小于10,就給數字前加空格 |
| %12s | 輸出的字符串至少為12個字符.如果該字符串條目小于12個字符,就在該字符串前加空格.如果該字符串條目多余12個字符,則自動增加寬度 |
例子
public class PrintfDemo {public static void main(String[] args) {System.out.printf("%5.6f",12345678.12345678);System.out.println();System.out.printf("%8.4f",1.12);System.out.println();System.out.printf("%-8.4f",1.12);} } /*輸出: 12345678.1234571.1200 1.1200 */關于格式化 format() 方法請閱讀 Java 學習筆記(七)–格式化字符串及格式化輸出 。
總結
以上是生活随笔為你收集整理的Java学习笔记(十)--控制台输入输出的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java学习笔记(九)--数组及Arra
- 下一篇: 我为什么重新开始学习数学?