第七章: Java 中如何正確使用輸入和輸出

前言

這篇文章, 給大家詳細(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)的就是outerr , 他們都是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í)outerr的用法完全一樣,功能也基本相同。

outerr的唯一區(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 方法, 用于格式化輸出.


printfprint, println 在使用上差別不大, 主要區(qū)別就是printf 方法第一個(gè)參數(shù)為輸出的模板字符串. 字符串中可以使用格式化,

printfprint 方法一樣不會(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 , 需要遵循以下步驟:

  1. 導(dǎo)包: 導(dǎo)入Scanner 類(lèi),導(dǎo)包的的知識(shí)之后會(huì)相信分析, 這里通過(guò)import關(guān)鍵字導(dǎo)包
  2. 實(shí)例化: 創(chuàng)建Scanner 類(lèi)的實(shí)例對(duì)象, 使用new 關(guān)鍵字
  3. 獲取 :使用Scanner 對(duì)象的掃描輸入的內(nèi)容
  4. 釋放: 通過(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í):

  1. 理解輸入輸出流
  2. 常用的輸出方法: System.out.print, System.out.println,System.out.printf
  3. 輸入類(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è)提示信息。


如果覺(jué)得這篇文章對(duì)你有幫助, 點(diǎn)贊關(guān)注不迷路, 你的支持是我的動(dòng)力!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容