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 個解答
- FrederichLv 49 年前最佳解答
這個跟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還有字元他就會跑完