Java - read 概念

char x='\0';

do

{

x = (char)br.read();

System.out.print(x+" ");

}while(x!='\n');

}

----

char x='\0';

do

{

x = (char)br.read();

System.out.print(x);

}while(x!='\n');

}

-----

假設輸入123

第一程式碼會顯示 (空格)2(空格)3

第二程式碼會顯示 123

第一個問題 : 為什麼不是 1(空格)2(空格)3

-----

承 第二程式碼

輸入123

顯示123

但是 read 不是 取單字元嗎?

第二個問題 : 輸入123 後 按下Enter ,,

x 應該是取 1

然後印出 1

結束迴圈

為什麼還有23 ?

----

希望能跟我說點 read 的概念 謝謝

2 個解答

評分
  • 9 年前
    最佳解答

    這個跟read的觀念沒有關係,和 Windows的換行字元格式有關。

    Windows的換行字元是 \r\n,\r是回到該行的開頭,\n是開啟新的一行,因此換行的動作其實是:

    先回到該行的開頭。(return)開啟新的一行。 (new line) 所以,程式讀到 3 後,會先讀到 \r 並輸出,把該行開頭第一個字元洗掉(也就是1),然後再讀到 '\n' + 空白,輸出。

    要解決這個問題,只要把換行字元處理好就可以了。

    System.getProperty("line.separator") 可以取得系統換行字元的字串。

    如下修改就可以了:

    char x='\0';

    String newline = System.getProperty("line.separator");

    do

    {

    x = (char)br.read();

    if( newline.indexOf(x) < 0) // 偵測讀到的字元是否屬於換行字元

    System.out.print(x+" ");

    }while(x!='\n');

    如果你想有更高的跨平台性,可以把迴圈的結束條件改為:

    newline.charAt( newline.length()-1) != x

    因為Mac有些版本上的換行字元是 \r,沒有\n。

    2010-12-19 12:40:14 補充:

    1被洗掉是因為 \r+" ",空格把1蓋掉的關係。

    2010-12-19 12:42:41 補充:

    read( ) 是讀取單字元沒錯,但你用迴圈一直讀,讀到換行字元才會停止,因此還是會把整行讀完。

    2010-12-19 12:51:42 補充:

    簡單的說,你輸入123之後,123會先被存到暫存區。

    read每次讀取,是先讀取暫存區中的第一個字元,然後把指標挪到下一個字元(就是下次要回傳的字元。)

    123\r\n 第一次呼叫read時的狀態

    ^

    123\r\n 第二次呼叫時的狀態

    ^

    ...

    123\r\n 讀到\n,迴圈結束

    ^

    2010-12-19 12:52:45 補充:

    呃 空格被吃掉了。總之,第二次呼叫時,read的指標是指向2,最後一次呼叫時,read的指標是指向\n

  • 9 年前

    我也不是很懂:D

    public int read() throws IOException {

    synchronized (lock) {

    ensureOpen();

    for (;;) {

    if (nextChar >= nChars) {

    fill();

    if (nextChar >= nChars)

    return -1;

    }

    if (skipLF) {

    skipLF = false;

    if (cb[nextChar] == '\n') {

    nextChar++;

    continue;

    }

    }

    return cb[nextChar++];

    }

    }

    }

    這是read的演算

    第一題我跑出來是1 2 3

    會跑出123是因為你用的是迴圈

    如果你把迴圈拿掉就會跑1

    只要x還有字元他就會跑完

還有問題?馬上發問,尋求解答。