爲什麼要有輸入和輸出
- 程序的作用是什麼?
- 組成計算機不可缺少的兩個部分是什麼?
想清楚這兩個問題應該就明白爲什麼又輸入和輸出了。我們編程、使用計算機莫非就是爲了達到某種目的,比如:我們給計算機輸入1 + 1
一個公式,計算機就輸出給我們一個2
的結果。所以爲了這種目的,我們必須告訴他要做什麼,做完之後反饋給我們什麼。
- 這裏也爲了增加我們後續示例的趣味性,有了輸入和輸出就相當於有了交互。
現在的程序交互都是使用GUI(圖形用戶界面),但我們現在還遠遠達不到這種程度,我們暫時只需要實現在控制檯(黑窗口)上的輸入和輸出就可以了。
GUI:(Graphical User Interface,簡稱 GUI,又稱圖形用戶接口)是指採用圖形方式顯示的計算機操作用戶界面。來自百度百科 - GUI。
讀取輸入
之前的示例我們經常接觸打印輸出到“標準輸出流”(控制檯窗口、黑窗口),只要使用System.out.println()
方法即可。
讀取“標準輸入流”使用對應的System.in
對象,但這裏稍微複雜一丟丟,我們想要通過控制檯使用System.in
進行輸入,需要先構造一個Scanner
對象,並且與“標準輸入流”System.in
關聯。如下:
Scanner in = new Scanner(System.in);
- 注意:
Scanner
類定義在java.util
包中。當使用的類不是定義在最基本的java.lang
包中時,需要使用import
關鍵字將相應的包加載進來,import
語句放在類文件的最前面。
import java.util.*;
Scanner
類包含一些常用方法(有興趣的可以查看一下API文檔):
nextLine()
:讀取一行。next()
:讀取一個單詞(以空白符作爲分隔符)。nextInt()
:讀取一個整數。nextDouble()
:讀取一個浮點數。- ……
import java.util.*;
// 輸入輸出 實例
public class InputOutput {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// nextLint()
System.out.println("你叫什麼名字?");
String name = in.nextLine();
// nextInt()
System.out.println("你今年多大了?");
int age = in.nextInt();
// 輸出
System.out.println("你好," + name + ", 明年你就" + (age + 1) + "歲了。");
}
}
格式化輸出
格式化輸出就是將一句話或者要輸出的內容按照一定的格式進行輸出打印,內容中需要填充的變量先使用一種字符(格式說明符)代替,再根據規則用變量值替換格式說明符即可。
看例子:
// 輸出
System.out.println("你好," + name + ", 明年你就" + (age + 1) + "歲了。");
// 格式輸出
System.out.printf("你好,%s, 明年你就%d歲了。", name, (age + 1));
- 注意這裏使用的是
printf()
方法。
- 可以看到,
println
和printf
輸出的結果是一樣的,printf
更注重輸出語句的格式,看着更加規整。 - 在實際使用中,若只是臨時輸出,格式化輸出使用的並不頻繁,但在需要大量輸出內容進行人機交互的時候,格式化輸出就必不可少了。
例子詳解:
示例中每一個以%
字符開始的格式說明符(%s
、%d
)都用對應(根據位置對應,第一個格式說明符對應第一個參數,以此類推)的參數替換。格式說明符尾部的轉換符將指示被格式化的數值類型。如f表示浮點數,s表示字符串,d表示十進制整數,詳細見下表:
轉換符 | 類型 | 轉換符 | 類型 |
---|---|---|---|
d | 十進制整數 | s | 字符串 |
x | 十六進制整數 | c | 字符 |
o | 八進制整數 | b | 布爾 |
f | 定點浮點數 | h | 散列碼 |
e | 指數浮點數 | tx或Tx | 日期時間(已過時) |
g | 通用浮點數 | % | 百分號 |
a | 十六進制浮點數 | n | 與平臺有關的行分隔符 |
- 可以使用控制格式化輸出的各種標誌。
- 且可以同時使用多個標誌。
// 使用格式化輸出標誌
System.out.printf("%,.2f", 1000.0 / 3.0);
標誌 | 作用 |
---|---|
+ | 打印正數和負數的符號 |
空格 | 在正數之前添加空格 |
0 | 數字前面補0 |
- | 左對齊 |
( | 將負數括在括號內 |
, | 添加分組分隔符 |
#(對於f格式) | 包含小數點 |
#(對於x或0格式) | 包含前綴0x |
$ | 給定被格式化的參數索引。如:%1x將以十進制和十六進制格式打印第1個參數 |
< | 格式化前面說明的數值。如:%d%<x以十進制和十六進制打印同一個數值 |
- 可以使用靜態的
String.format()
方法創建一個格式化的字符串,而不是打印輸出:
// 格式化創建字符串
String message = String.format("你好,%s, 明年你就%d歲了。", "靜心事成", 2);
System.out.println(message);
文件輸入與輸出
- 讀取文件。需要用
File
對象構建一個Scanner
對象。
Scanner in = new Scanner(Paths.get("test.txt"), "UTF-8");
- 這裏使用到了Paths類,需要進行引入,Paths的包位置:
java.nio.file.Paths
。 - 寫入文件。需要構造一個
PrintWriter
對象。在構造器中,只需要提供文件名,如果文件不存在,則會自動創建文件:
PrintWriter out = new PrintWriter("pw.txt", "UTF-8");
PrintWriter
類在java.io
包下,需要引入。- 可以想使用
System.out
對應一樣使用print
、println
、printf
方法。 - 在進行文件的輸入和輸出時,有可能會產生一些異常,這些異常是我們可以想象得到的,所以在程序編譯的時候會提示需要進行異常處理,我們先在
main
方法上加上throws Exception
,將異常拋出,後續會詳細講解異常。
完整示例:
import java.util.*;
import java.nio.file.Paths;
import java.io.PrintWriter;
// 輸入輸出 實例
public class InputOutput {
public static void main(String[] args) throws Exception {
// 文件的輸入和輸出
Scanner in = new Scanner(Paths.get("test.txt"), "UTF-8");
System.out.println(in.nextLine());
PrintWriter out = new PrintWriter("pw.txt", "UTF-8");
out.println("hello, world, pw");
out.flush(); // 清空緩衝區
// 讀文件輸出內容
in = new Scanner(Paths.get("pw.txt"), "UTF-8");
System.out.println(in.nextLine());
}
}
想要說的話
- 輸入和輸出現在主要用在日誌的打印,程序的調試。
- 軟件交互上,桌面軟件都使用GUI(圖形用戶界面)進行交互,網絡系統使用網頁進行交互。
- 但在學習的路上,有了控制檯的輸入和輸出,增加了編程的趣味性(有了交互)。
捐贈
若你感覺讀到這篇文章對你有啓發,能引起你的思考。請不要吝嗇你的錢包,你的任何打賞或者捐贈都是對我莫大的鼓勵。