許多初學者嘗試用 DataInputStream.readInt() 讀取控制台輸入的整數,卻發現輸入 12 後程序輸出 825363722。這背後揭示了字節流與字符流的本質區別。
import java.io.DataInputStream;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
System.out.println("請輸入數字:");
DataInputStream dis = new DataInputStream(System.in);
int x = 0;
try {
x = dis.readInt();
System.out.println(x); // 輸入 12 回車,輸出 825363722
} catch (IOException e) {
e.printStackTrace();
}
}
}
readInt() 按大端序讀取 4 個字節 組合成 int:
byte1 << 24 | byte2 << 16 | byte3 << 8 | byte4
控制台輸入 12\n 實際發送字符序列:'1'(49)、'2'(50)、'\r'(13)、'\n'(10)。對應 ASCII 碼正好 4 個字節:
49 * 2^24 + 50 * 2^16 + 13 * 2^8 + 10 = 825363722
Scanner.nextInt() 解析文本格式整數BufferedReader.readLine() + Integer.parseInt()DataInputStream 適合讀取二進制格式數據(如網絡協議、文件存儲)字節流處理原始二進制,字符流處理文本編碼。控制台輸入本質是文本流,必須經過解碼/解析才能得到語義上的數值。混淆二者是 Java IO 入門最常見的誤區之一。