前言
這篇文章, 給大家詳細(xì)的梳理Java 中標(biāo)準(zhǔn)的 輸入和輸出語(yǔ)句, 看看都有哪些細(xì)節(jié)需要我們掌握
Java 中有三個(gè)標(biāo)準(zhǔn)"流", 他們被統(tǒng)稱(chēng)為standard streams
標(biāo)準(zhǔn)輸入流:基于流的輸入(stdin),Java中對(duì)應(yīng)的API是System.in;標(biāo)準(zhǔn)輸出流:基于流的輸出(stdout),Java中對(duì)應(yīng)的API是System.out;標(biāo)準(zhǔn)錯(cuò)誤流:基于流的錯(cuò)誤輸出(stderr),Java中對(duì)應(yīng)的API是System.err;
通過(guò)上面的描述, 這三者功能如下:
-
標(biāo)準(zhǔn)輸入流可以讓我們?cè)诳刂婆_(tái)中輸入信息,通過(guò)輸入流的處理,獲取輸入的數(shù)據(jù), 供程序使用 -
標(biāo)準(zhǔn)輸出流,錯(cuò)誤流, 可以讓我們將需要的信息輸出到控制臺(tái), 可以用于查看程序運(yùn)行的結(jié)果, 或提示信息
接下來(lái)就給大家詳細(xì)分析輸出與輸出
1. 輸出語(yǔ)句
其實(shí),在前面的學(xué)習(xí)中, 我們已經(jīng)知道Java的輸出功能了, 就是利用System.out.println()語(yǔ)句來(lái)實(shí)現(xiàn)的.
接下來(lái), 我們來(lái)分析一下該語(yǔ)句的含義
1.1 System
首先出場(chǎng)的就是System , System 是一個(gè)Java 內(nèi)置的(自帶的) 類(lèi).代表一個(gè)系統(tǒng)類(lèi)
至于什么是類(lèi), 我們會(huì)在面向?qū)ο笳鹿?jié)講解. 你暫時(shí)可以這么理解, 類(lèi)就是將功能相關(guān)的操作放在一起, 也就是將各種方法放在類(lèi)里面, 之后就可以通過(guò)類(lèi)來(lái)使用這些功能.
而System 是一個(gè)系統(tǒng)類(lèi), 位于java.lang 包中, 在該類(lèi)里面具有很多系統(tǒng)界別的屬性, 控制方法, 供我們使用
System 類(lèi)中成員變量和成員方法都是static, 即靜態(tài)成員, 因此我們可以直接通過(guò)System 類(lèi)名進(jìn)行調(diào)用.
System 類(lèi)提供了如下核心功能:
- 標(biāo)準(zhǔn)輸入輸出:如out、in、err;
- 外部定義的屬性和環(huán)境變量的訪問(wèn):如getenv()、setenv()、getProperties()和setProperties();
- 加載文件和類(lèi)庫(kù)的方法:如load()和loadLibrary();
- 快速拷貝數(shù)組的方法:arraycopy();
- jvm操作:如gc()、runFinalization()、exit();
- 獲取系統(tǒng)時(shí)間方法:如System.nanoTime 和 System.currentTimeMillis。
這篇文章主要分析的就是標(biāo)準(zhǔn)輸入輸出: out , in ,err
1.2 out與err
接下來(lái)出場(chǎng)的就是out 和err , 他們都是System 類(lèi)的屬性, 即靜態(tài)成員. 因此可以被類(lèi)直接獲取, 即System.out, System.err 操作
out 表示一種"標(biāo)準(zhǔn)" 的輸出流, 其值是java.io.PrintStream類(lèi)的引用。
err 表示“標(biāo)準(zhǔn)”的錯(cuò)誤輸出流,err輸出的信息, 用于顯示錯(cuò)誤消息,或者用于顯示需要引起用戶(hù)特別注意的信息,在控制臺(tái)中會(huì)顯示紅色的文字。
示例
public class PrintTest {
public static void main(String[] args) {
System.out.print("out 標(biāo)準(zhǔn)輸出");
System.err.print("err 標(biāo)準(zhǔn)輸出的錯(cuò)誤信息");
}
}
其實(shí)out和err的用法完全一樣,功能也基本相同。
out和err的唯一區(qū)別就是,out往往是帶緩存功能的,而err沒(méi)有緩存功能
1.3 print 和 println
最后出場(chǎng)的成員就是print() 和println() 方法. 這兩個(gè)方法out , err 輸出流都可以使用
print() 和println() 兩個(gè)方法都是java.io.PrintStream類(lèi)里提供的方法, 他們的作用都是向控制臺(tái)輸出信息。兩者的基本作用完全一樣
區(qū)別在于:
-
print()方法不會(huì)產(chǎn)生換行 -
println()會(huì)產(chǎn)生換行, 是print line的縮寫(xiě). 表示輸出并換行
示例:
public class PrintTest {
public static void main(String[] args) {
// 不換行輸出
System.out.print("hello ");
System.out.print("world! \n"); // 通過(guò)\n 手動(dòng)換行
// 換行輸出
System.out.println("大家好:");
System.out.print("今天天氣很不錯(cuò)哦! \n");
// err 錯(cuò)誤信息不換行輸出
System.err.print("hello ");
System.err.print("world! \n"); // 通過(guò)\n 手動(dòng)換行
// err 錯(cuò)誤信息換行輸出
System.err.println("大家好:");
System.err.print("今天天氣很不錯(cuò)哦!");
}
}
1.4 printf 格式化輸出
1.4.1 格式化輸出的理解
有時(shí)候,計(jì)算機(jī)默認(rèn)輸出的數(shù)據(jù)格式,并不一定能夠滿(mǎn)足我們的閱讀需求。
比如有的人想要保留小數(shù)點(diǎn)后兩位,也有的人想要保留小數(shù)點(diǎn)后四位,針對(duì)大家不同的輸出需求,Java 提供了printf 方法, 用于格式化輸出.
printf 和print, println 在使用上差別不大, 主要區(qū)別就是printf 方法第一個(gè)參數(shù)為輸出的模板字符串. 字符串中可以使用格式化,
printf 和print 方法一樣不會(huì)自動(dòng)換行輸出
1.4.2 占位符
Java為了實(shí)現(xiàn)格式化輸出的功能,給我們提供了多種占位符,可以在字符串模板中, 使用各種數(shù)據(jù)類(lèi)型“格式化”的占位符。
常用的占位符有如下這些:
| 占位符 | 說(shuō)明 |
|---|---|
| %d | 格式化輸出整數(shù) |
| %x | 格式化輸出十六進(jìn)制整數(shù) |
| %f | 格式化輸出浮點(diǎn)數(shù) |
| %e | 格式化輸出科學(xué)計(jì)數(shù)法表示的浮點(diǎn)數(shù) |
| %s | 格式化輸出字符串 |
這里我們要注意,在輸出語(yǔ)句中,%表示占位符。有特殊意義, 如果只是向在模板字符串中輸出一個(gè)普通的% 字符, 需要使用%% ,
如果你想了解更詳細(xì)的格式化參數(shù),可以參考JDK文檔:java.util.Formatter
1.4.3 示例
public class Person {
public static void main(String[] args) {
// 格式化 字符串, 整數(shù), 浮點(diǎn)數(shù)
System.out.printf("姓名:%s, 年齡:%d, 成績(jī):%f \n", "張三", 15, 86.6);
// 格式化: 十六進(jìn)制整數(shù), 科學(xué)計(jì)數(shù)法浮點(diǎn)數(shù)
System.out.printf("字符串模板: 十六進(jìn)制輸出:%x, 科學(xué)計(jì)數(shù)法: %e", 30, 16.8);
}
}
輸出結(jié)果:
姓名:張三, 年齡:15, 成績(jī):86.600000
字符串模板: 十六進(jìn)制輸出:1e, 科學(xué)計(jì)數(shù)法: 1.680000e+01
2. 輸入語(yǔ)句
2.1 輸入語(yǔ)句簡(jiǎn)介
除了輸出流以外, Java 還有一個(gè)負(fù)責(zé)輸入的標(biāo)準(zhǔn)流, 對(duì)應(yīng)的API 是System.in.
與標(biāo)準(zhǔn)輸出相比,標(biāo)準(zhǔn)輸入則復(fù)雜的多。尤其是直接使用System.in時(shí),雖然可以讀取到用戶(hù)的輸入,但該方式特別的復(fù)雜,對(duì)咱們初學(xué)者來(lái)說(shuō)很不友好。
所以為了更方便地實(shí)現(xiàn)輸入功能, 我們介紹一個(gè)簡(jiǎn)單的類(lèi), 即Scanner 類(lèi):
2.2 Scanner 類(lèi)簡(jiǎn)介
Scanner類(lèi)是Java 5中開(kāi)始提供的,負(fù)責(zé)解析基本類(lèi)型和字符串的簡(jiǎn)單文本掃描器。通過(guò)Scanner類(lèi),我們可以獲取用戶(hù)在控制臺(tái)里的輸入數(shù)據(jù)。
Scanner類(lèi)里常用API方法有如下幾個(gè):
nextInt():獲取輸入的整數(shù);nextDouble():獲取輸入的雙精度浮點(diǎn)數(shù);nextLine():獲取輸入的字符串,包括單詞里的空格和除回車(chē)以外的所有字符;next():獲取輸入的字符串,只從有效字符計(jì)算。獲取到字符前的空字符都會(huì)被自動(dòng)忽略,之后的空格鍵,Tab,Enter 鍵都視做結(jié)束符
2.3 使用步驟
使用Scanner , 需要遵循以下步驟:
-
導(dǎo)包: 導(dǎo)入Scanner類(lèi),導(dǎo)包的的知識(shí)之后會(huì)相信分析, 這里通過(guò)import關(guān)鍵字導(dǎo)包 -
實(shí)例化: 創(chuàng)建Scanner類(lèi)的實(shí)例對(duì)象, 使用new關(guān)鍵字 -
獲取:使用Scanner對(duì)象的掃描輸入的內(nèi)容 -
釋放: 通過(guò)Scanner對(duì)象的close方法釋放資源
需要注意的是:根據(jù)相應(yīng)的方法,來(lái)輸入指定類(lèi)型的值。
如果輸入的數(shù)據(jù)類(lèi)型與要求的類(lèi)型不匹配時(shí),會(huì)報(bào)異常 導(dǎo)致程序終止。
2.4 Scanner各種類(lèi)型輸入示例
案例: 小明注冊(cè)某交友網(wǎng)站,要求錄入個(gè)人相關(guān)信息。如下:
請(qǐng)輸入你的網(wǎng)名、你的年齡、你的體重、你是否單身、你的性別等情況。
示例:
// 1. 導(dǎo)入包
import java.util.Scanner;
public class Person {
public static void main(String[] args) {
// 2.創(chuàng)建實(shí)例對(duì)象, System.in 表示鍵盤(pán)輸入
Scanner scanner = new Scanner(System.in);
// 3. 根據(jù)提示, 調(diào)用不同的方法, 獲取不同類(lèi)型的數(shù)據(jù)
System.out.println("歡迎進(jìn)入本交友網(wǎng)站!");
// 獲取字符串信息
System.out.println("請(qǐng)輸入你的網(wǎng)名:");
String name = scanner.next();
// 獲取 int 類(lèi)型
System.out.println("請(qǐng)輸入你的年齡:");
int age = scanner.nextInt();
// 獲取 double 類(lèi)型
System.out.println("請(qǐng)輸入你的體重:");
double weight = scanner.nextDouble();
// 獲取 boolean 類(lèi)型
System.out.println("你是否單身(true/false):");
boolean isSingle = scanner.nextBoolean();
// 獲取 char 類(lèi)型
System.out.println("請(qǐng)輸入你的性別:");
char gender = scanner.next().charAt(0); // 按照字符串接收,獲取第一個(gè)字符
// 輸出結(jié)果:
System.out.println("你的基本情況如下:");
System.out.println("網(wǎng)名:" + name + "; 年齡:" + age + "; 體重:" + weight +
"; 單身:" + isSingle + "; 性別:" + gender);
// 4. 關(guān)閉資源
scanner.close();
}
}
運(yùn)行結(jié)果:
歡迎進(jìn)入本交友網(wǎng)站!
請(qǐng)輸入你的網(wǎng)名:
張三
請(qǐng)輸入你的年齡:
18
請(qǐng)輸入你的體重:
120.5
你是否單身(true/false):
true
請(qǐng)輸入你的性別:
男
你的基本情況如下:
網(wǎng)名:張三; 年齡:18; 體重:120.5; 單身:true; 性別:男
3. 結(jié)語(yǔ)
至此, 我們就把Java 中的輸入和輸出語(yǔ)句給大家講解完畢了, 本節(jié)內(nèi)容并不復(fù)雜. 學(xué)完之后, 你應(yīng)該掌握以下知識(shí):
- 理解輸入輸出流
- 常用的輸出方法:
System.out.print,System.out.println,System.out.printf - 輸入類(lèi)
Scanner中的一些輸入方法, 比如next,nextInt,nextDouble等
4. 本節(jié)練習(xí)
4.1 第一題
輸入一個(gè)整數(shù), 分別輸出各個(gè)位的數(shù)值, 比如:輸入1234, 輸出1,2,3,4
4.2 第二題
我家的狗5歲了,5歲的狗相當(dāng)于人類(lèi)多大呢?
其實(shí),狗的前兩年每一年相當(dāng)于人類(lèi)的10.5歲,之后每增加一年就增加四歲。那么5歲的狗相當(dāng)于人類(lèi)多少年齡呢?應(yīng)該是:10.5 + 10.5 + 4 + 4 + 4 = 33歲。
編寫(xiě)一個(gè)程序,獲取用戶(hù)輸入的狗的年齡,通過(guò)程序顯示其相當(dāng)于人類(lèi)的年齡。如果用戶(hù)輸入負(fù)數(shù),請(qǐng)顯示一個(gè)提示信息。