鍵盤輸入(System.in)是位元組流(InputStream),但我們常需要逐行讀取文字(readLine()),這是字元流(BufferedReader)的功能。如何橋接兩者?
InputStreamReader 是位元組流通向字元流的橋樑,它本身是字元流,建構子接受一個位元組流參數。再包裝一層 BufferedReader 即可高效逐行讀取。
import java.io.*;
public class TransStreamDemo {
public static void main(String[] args) throws IOException {
// 1. 獲取鍵盤輸入位元組流
InputStream in = System.in;
// 2. 位元組流 → 字元流(指定編碼更安全:new InputStreamReader(in, "UTF-8"))
InputStreamReader isr = new InputStreamReader(in);
// 3. 加入緩衝區,支援 readLine() 高效讀取
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
if ("over".equals(line)) break; // 輸入 over 結束
System.out.println(line.toUpperCase()); // 轉大寫輸出
}
br.close(); // 關閉頂層流會自動關閉底層流
}
}
System.in (InputStream)
↓ 包裝
InputStreamReader (Reader) — 解碼:bytes → chars (使用預設/指定 Charset)
↓ 包裝
BufferedReader (Reader) — 緩衝:提供 readLine()、read(char[]) 等高效操作
// 明確指定 UTF-8,避免平台預設編碼不一致導致亂碼
InputStreamReader isr = new InputStreamReader(System.in, StandardCharsets.UTF_8);
// 或 Java 7+
InputStreamReader isr = new InputStreamReader(System.in, "UTF-8");
new FileReader("file.txt") 實際上內部就是 InputStreamReader + FileInputStream)// Java 7+ try-with-resources 自動關閉
try (BufferedReader br = new BufferedReader(
new InputStreamReader(System.in, StandardCharsets.UTF_8))) {
String line;
while ((line = br.readLine()) != null) {
// 處理邏輯
}
} // 自動關閉 br、isr、in
readLine() 等便利方法try-with-resources 確保資源釋放