首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

DataInputStream.readInt() 讀取控制台輸入的陷阱解析

     編輯:Java 綜合教學

DataInputStream.readInt() 讀取控制台輸入的陷阱解析

許多初學者嘗試用 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 入門最常見的誤區之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved