在 Java 開發中,System.out.println() 與 System.out.write() 都是向標準輸出輸出資料的常用方法,但兩者的運作機制、適用場景與輸出行為卻有本質不同。許多初學者容易混淆「字元流」與「位元組流」的概念,導致使用時產生預期外的結果。本文將透過程式碼實測與原理說明,釐清兩者的關鍵差異。
| 特性 | System.out.println() | System.out.write() |
|---|---|---|
| 所屬類別 | PrintStream | OutputStream(父類別定義) |
| 資料單位 | 字元(支援字串、物件、基本型別) | 位元組(int 0~255 或 byte[]) |
| 換行處理 | 自動附加平台相關換行符 | 不自動換行,需手動加入 |
| 編碼轉換 | 內部依預設字元集將字元轉位元組 | 直接寫入位元組,不經編碼轉換 |
| 常見用途 | 一般除錯、日誌輸出、人類可讀文字 | 二進位資料、精確控制位元組輸出 |
public class Demo1 {
public static void main(String[] args) {
int a = 65; // ASCII 'A'
System.out.write(a); // 輸出位元組 65 -> 顯示 'A'
System.out.println(); // 換行
System.out.println(a); // 輸出字串 "65"
}
}
執行結果:
A
65
write(int) 只取整數低 8 位元(0~255)作為位元組寫出,65 對應 ASCII 'A';println(int) 則會將整數轉為字串 "65" 再經編碼輸出。
public class Demo2 {
public static void main(String[] args) throws IOException {
// 兩種寫法效果相同:皆輸出 "hello" 並換行
System.out.write("hello\n".getBytes()); // 手動轉位元組 + 手動加換行
System.out.println("hello"); // 自動轉字元 + 自動加換行
}
}
PrintStream(System.out 的實際型別)內部持有 OutputStreamWriter,負責將字元依預設/指定字元集轉為位元組再交給底層 OutputStream 寫出。write() 繞過這層轉換,直接操作位元組。println() 輸出中文可能亂碼;write(bytes) 則完全由開發者控制編碼。println() 的編碼轉換與自動刷新(遇換行)可能成為瓶頸;可改用 BufferedWriter 或批次 write(bytes)。write(byte[]) 或 OutputStream 子類別,切勿用 println()。System.out.println() 是面向「人類可讀文字」的高階封裝,自動處理字元編碼與換行;System.out.write() 是面向「位元組」的底層操作,給予開發者精確控制權。理解兩者差異,能避免編碼問題、提升輸出效能,並正確處理二進位資料。