java的輸入語句與輸出語句
Java中其實有三個標(biāo)準(zhǔn)的“流”,他們被統(tǒng)稱為standard streams:
標(biāo)準(zhǔn)輸入:基于流的輸入(stdin),Java中對應(yīng)的API是System.in;
標(biāo)準(zhǔn)輸出:基于流的輸出(stdout),Java中對應(yīng)的API是System.out;
標(biāo)準(zhǔn)錯誤:基于流的錯誤輸出(stderr),Java中對應(yīng)的API是System.err;
這三者之間的關(guān)系是,我們在命令行中輸入各種指令,轉(zhuǎn)到stdin的環(huán)境中運(yùn)行處理,并在控制臺中將處理好的結(jié)果,利用stdout和stderr進(jìn)行輸出顯示為文本,還可以將結(jié)果重定向到對應(yīng)的磁盤文件等。接下來就給大家詳細(xì)地講講輸入和輸出。
一. 輸出語句
我們在前面的文章和案例中,其實早就知道Java是如何實現(xiàn)輸出功能的了。沒錯,就是利用System.out.println()語句來實現(xiàn)的!接下來壹哥就給大家詳細(xì)解讀一下這個語句的作用及其含義。
System
我們先來看看System是個什么東東。
System是Java自帶的一個類,它代表著系統(tǒng)類。該類位于https://baike.baidu.com/item/java.lang/5179788?fromModule=lemma_inlink包中,很多有用的系統(tǒng)級別的屬性、控制方法都在該類里面。
System類的構(gòu)造方法是private(私有)修飾的,所以我們無法直接創(chuàng)建該類的對象,即無法實例化該類。關(guān)于這些對象的實例化,壹哥在后面講解面向?qū)ο髸r會再詳細(xì)講解,大家先不要著急哦。System內(nèi)部的成員變量和成員方法都是static的,我們可以很方便的直接進(jìn)行調(diào)用。在System類里面,給我們提供了如下幾個核心功能:
●標(biāo)準(zhǔn)輸入輸出:如out、in、err;
●外部定義的屬性和環(huán)境變量的訪問:如getenv()、setenv()、getProperties()和setProperties();
●加載文件和類庫的方法:如load()和loadLibrary();
●快速拷貝數(shù)組的方法:arraycopy();
●jvm操作:如gc()、runFinalization()、exit();
●獲取時間方法:如System.nanoTime 和 System.currentTimeMillis。
Java中的輸出語句通常使用System.out.println()方法來實現(xiàn)。這個方法可以將括號內(nèi)的內(nèi)容輸出到控制臺。例如:
System.out.println("Hello, world!");
out與err
out表示一種“標(biāo)準(zhǔn)”的輸出流,它是System類中的靜態(tài)成員,可以直接被我們調(diào)用,且這個成員變量是java.io.PrintStream類的引用。
另外還有一個與out功能類似的輸出流err。err表示“標(biāo)準(zhǔn)”的錯誤輸出流,此流可以打開并準(zhǔn)備接受輸出的數(shù)據(jù)。一般err流用于顯示錯誤消息,或者用于顯示需要引起用戶特別注意的信息,在控制臺中會顯示紅色的文字。
其實out和err的用法完全一樣,功能也基本相同。out和err的唯一區(qū)別就是,out往往是帶緩存功能的,而err沒有緩存功能(默認(rèn)設(shè)置,可以更改)。
print和println
print()和println()都是java.io.PrintStream類里的方法,它們的作用都是向控制臺輸出信息。兩者的基本作用完全一樣,只是print()方法不會產(chǎn)生換行,println()會產(chǎn)生換行,因為println是print line的縮寫,表示輸出并換行。
通過以上這3個API(應(yīng)用程序接口)的講解,我們可以總結(jié)出一個基本的規(guī)則:在Java中,被static關(guān)鍵字修飾的成員變量,可以直接通過"類名.成員名"的形式來引用,不用創(chuàng)建類的實例對象。所以我們可以直接調(diào)用System類里的靜態(tài)成員out,即System.out。又因為System.out是java.io.PrintStream類的實例引用,所以又可以通過 System.out.println(); 的形式來調(diào)用。
以上這段話,如果你看著有點懵逼,請不用糾結(jié)。這屬于面向?qū)ο蟮闹R,我們暫時還沒學(xué)到哦!!!但是后續(xù)大家都會讓大家學(xué)到的!!!
基本案例
以下是關(guān)于標(biāo)準(zhǔn)輸出的代碼案例,大家對著練習(xí)一下即可,很簡單的哦。
public class Demo01 {
}
運(yùn)行效果如下圖所示:
格式化輸出
5.1 概念
有時候,計算機(jī)默認(rèn)輸出的數(shù)據(jù)格式,并不一定能夠滿足我們的閱讀需求,比如有的人想要保留小數(shù)點后兩位,也有的人想要保留小數(shù)點后四位,大家的需求是個性化的,那么Java能不能針對特殊的需求,進(jìn)行一些個性化的輸出呢?這是可以實現(xiàn)的!這就需要用到格式化輸出了!
利用格式化輸出功能,可以把數(shù)據(jù)顯示成我們期望的格式。我們可以使用System.out.printf()語句,并結(jié)合%與?這兩個占位符來實現(xiàn),printf()方法可以把后面的參數(shù)格式化成指定的格式。
5.2 占位符
Java為了實現(xiàn)格式化功能,給我們提供了多種占位符,可以把各種數(shù)據(jù)類型“格式化”成指定的字符串。常用的占位符有如下這些:
這里我們要注意,在輸出語句中,%表示占位符。如果連續(xù)使用兩個%%,應(yīng)該傳入兩個對應(yīng)的數(shù)字,否則會把后面的%字符給原文輸出。
如果我們想了解更詳細(xì)的格式化參數(shù),可以參考JDK文檔:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Formatter.html#syntax
5.3 案例
下面是設(shè)計的與本小節(jié)對應(yīng)的代碼案例,大家可以對照練習(xí)。
public class Demo01 {
}
二. 輸入語句
輸入簡介
壹哥在前面給大家講過,Java中給咱們提供了有三個標(biāo)準(zhǔn)的“流”,他們被統(tǒng)稱為standard streams。除了負(fù)責(zé)輸出的流之外,還有一個負(fù)責(zé)輸入的標(biāo)準(zhǔn)流,Java中對應(yīng)的API是System.in。
與標(biāo)準(zhǔn)輸出相比,標(biāo)準(zhǔn)輸入則復(fù)雜的多。尤其是直接使用System.in時,雖然可以讀取到用戶的輸入,但該方式特別的復(fù)雜,對咱們初學(xué)者來說很不友好。所以為了更方便地實現(xiàn)輸入功能,壹哥給大家介紹一個更簡單的Scanner類。
Scanner類
2.1 Scanner簡介
Scanner類是Java 5中開始提供的,負(fù)責(zé)解析基本類型和字符串的簡單文本掃描器。通過Scanner類,我們可以獲取用戶在控制臺里的輸入數(shù)據(jù)。Scanner類里常用API方法有如下幾個:
nextInt():獲取輸入的整數(shù);
nextDouble():獲取輸入的雙精度浮點數(shù);
nextLine():獲取輸入的字符串,包括單詞里的空格和除回車以外的所有字符;
next():獲取輸入的字符串,只從有效字符計算。在有效字符之前遇到的空格鍵、Tab鍵、換行符或Enter鍵等結(jié)束符,next()方法會自動將其去掉。只有在輸入有效字符之后,next()方法才會將其后面輸入的空格鍵、Tab鍵或Enter鍵等都視為分隔符或結(jié)束符,并以空格結(jié)束。
2.2 使用步驟
我們要想使用Scanner,需要遵循以下步驟:
1.導(dǎo)入Scanner類;
2.創(chuàng)建Scanner對象;
3.使用Scanner對象掃描輸入的內(nèi)容。
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
String inputString = scanner.nextLine(); // 讀取一行字符串
int inputInt = scanner.nextInt(); // 讀取一個整數(shù)
double inputDouble = scanner.nextDouble(); // 讀取一個雙精度浮點數(shù)
接下來就給大家設(shè)計一個案例,講解Scanner的具體使用。
3. 案例
本案例對初學(xué)者來說,具有一定的挑戰(zhàn)性,大家要集中精力哦。
//1.import導(dǎo)包:導(dǎo)入Scanner類
import java.util.Scanner;
/**
@author 一一哥Sun
QQ:2312119590
CSDN、掘金、知乎找我哦
*/
public class Demo03 {
public static void main(String[] args) {
//輸入語句
//2.創(chuàng)建一個從鍵盤錄入的Scanner掃描對象
Scanner sc = new Scanner(System.in);
//3.使用Scanner對象,掃描輸入的內(nèi)容(整數(shù)、小數(shù)、字符串、布爾)
//在控制臺或命令行輸入數(shù)字,并點擊回車鍵結(jié)束
System.out.println("請輸入一個數(shù)字");
int num = sc.nextInt();
System.out.println("你輸入的數(shù)字為:"+num);
System.out.println("請輸入一個小數(shù)");
double num2 = sc.nextDouble();
System.out.println("你輸入的數(shù)字為:"+num2);
System.out.println("請輸入一個字符串");
String str = sc.next();
System.out.println("你輸入的字符串為:"+str);
}
}
本案例效果如下: