Java的輸出及輸入控制大都定義在java.io.*裡,像是檔案File的讀寫,週邊設備RS232、LPT等的輸出與輸入都需要到Java IO。而Java IO大概分成二大類,一類是byte的讀取與寫出,可讀取寫入二位元binary的資料,而另一個是char的讀取與寫入,提供文字的讀取與寫入。
System類別並不屬於java.io的套件,而是屬於java.lang套件,在使用時預設載入,所以並不需要特別去import它。
- System.in 通常是指鍵盤的輸入,為java.io.InputStream類別
- System.out 通常是指Console螢幕輸出,為java.io.PrintStream類別
- System.err 同System.out,主要是用在系統出錯時輸出至Console螢幕
註:Java本身在處理字串時均是使用utf8 uncode的方式,不過在Windows的Console(螢幕)字串的顯示與輸入都是使用ISO-8859-1編碼,所以需要先把字串轉換成Big5再行輸出,在Linux上則不會有這種問題。
System.out
- System.out.println(內容):輸出”內容”加上”斷行\r\n”至Console(螢幕)
- System.out.print(內容):輸出”內容”至Console(螢幕)
如果要輸出的內容需要有字串、文字、日期等,可以利用字串的連接+來把字串串連起來進行輸出。ex.”中文”+123
如果需要自行做斷行,可以使用\r\n來做換行動作。ex.System.out.print(“中文\r\n我換行了”);

範例原始碼:
package yku.tech;
public class SysOut {
public static void main(String args[])
{
//會自動加入斷行\r\n
System.out.println("Hello World!!");
//不會斷行
System.out.print("This is a test!");
System.out.print(" 這會接在字串後面 ");
//數字、浮點、長整數、字元、字串都可以輸出
System.out.println(546);
int a = 456;
System.out.print("數字:");
System.out.println(a);
float b = 234.12f;
System.out.print("浮點數:");
System.out.println(b);
double c = 987.1;
System.out.print("Double:");
System.out.println(c);
char d = 'a';
System.out.print("字元:");
System.out.println(d);
String e = "中文字";
System.out.print("字串:");
System.out.println(e);
Object f = new Object();
System.out.print("物件:");
System.out.println(f);
System.out.print("物件toString:");
System.out.println(f.toString());
}
}
System.in
System.in為InputStream串流類別,可以直接使用read(byte[])來取出輸入內容、read()每次輸入的ascii數字(再轉換成字元char),或是利用BufferedReader來直接讀取一行內容等等,以下範例會實作這幾種種方式。
鍵盤的輸入完成預設為enter鍵,也就是\r\n。
(char)read()
對於中文字部份並無法判別,需要先把讀入的字元全部放進一個char 陣例,再利用new String(char[])來使中文字正常

範例原始碼:
package yku.tech;
public class SysIn {
public static void main(String args[]) {
// 輸入串流
java.io.InputStream in = System.in;
char c;
try {
System.out.print("請輸入字串:");
while ((c = (char) in.read()) > 0) {
System.out.print(c);
if (c == '\n')// 換行符號
System.out.print("請輸入字串:");
}
} catch (java.io.IOException ex) {
ex.printStackTrace();
}
}
}
使用BufferedReader一次讀取一行
需先把System.in轉換成InputStreamReader才可以讓BufferedReader使用,中文部份在此例子並不需要特別處理

範例原始碼:
package yku.tech;
public class SysIn2 {
public static void main(String args[]) {
// 輸入串流 ,變成BufferReader
java.io.BufferedReader buf = new java.io.BufferedReader(
new java.io.InputStreamReader(System.in));
String c;
try {
System.out.print("請輸入字串:");
while ( (c=buf.readLine())!=null) {
System.out.println(c);
System.out.print("請輸入字串:");
}
} catch (java.io.IOException ex) {
ex.printStackTrace();
}
}
}
read(byte[])
當輸入的內容長度大於byte長度時,就會被先行輸出,而byte陣例設定越大使用的記憶體也越大。中文部份因為Console是ISO-8859-1編碼,所以需要利用new String(byte[],”編碼”)來轉換成Big5輸出
由底下第一個圖可以知道當byte[]設定128時,字串輸入不足128長度時,輸出時還是會自動補足的,所以String內容還需要使用trim來去除多出來的空白部份。


範例原始碼:
package yku.tech;
public class SysIn3 {
public static void main(String args[]) {
// 輸入串流
java.io.InputStream in = System.in;
// 會一次讀取128個byte,如果輸入不夠時一樣會以空白填滿
byte[] b = new byte[128];
try {
System.out.print("請輸入字串:");
while (in.read(b) > 0) {
// 加上trim把不需要的空白移除
String str = new String(b, "Big5").trim();
System.out.println(str);
System.out.print("請輸入字串:");
}
} catch (java.io.IOException ex) {
ex.printStackTrace();
}
}
}
不好意思請問一下,要怎麼讓這個程式停下來 🙂
Console程式return掉就好了
GUI程式System.exit();