[問題] 關於鍵盤輸入的概念的一個問題
後來打完發現...
我顏色用的有點花...
不過我是希望大家看得懂啦...所以才用顏色分別...
對不起看的人的眼睛啦..sorry捏
我之前用C語言好久了
對於JAVA的資料流概念不是很能適應
不知道有沒有人能為我解釋一下
在C語言中的鍵盤輸入
是一個指令就一個輸入 例如 scanf 指令
若是檔案的資料流也是一個指令一個輸入 例如 fscanf fgetc 之類的
不過我剛剛在嘗試JAVA程式的鍵盤輸入
程式碼如下
import java.io.*;
public class BigNumberAdding
{
public static void main(String[] args) throws IOException
{
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
int c;
while(true)
{
c=br.read();
System.out.print((char)c + " ( " + c + " )\n");
}
}
}
不過當我執行的時候 我不能理解的是
例如我輸入一個字串 abc
當然的 他會印出↓
abc
a ( 97 )
b ( 98 )
c ( 99 )
( 13 )
( 10 )
但是接下來的程式程序是
我能繼續的再輸入東西 例如再次輸入 defgh 螢幕就會變成↓
abc
a ( 97 )
b ( 98 )
c ( 99 )
( 13 )
( 10 )
defgh
d ( 100 )
e ( 101 )
f ( 102 )
g ( 103 )
h ( 104 )
( 13 )
( 10 )
我的問題:
第一 關於這個Java程式的輸入指令在哪裡?
或許是我以前C語言的習慣@@?
我會用一道一道的指令去檢視程式碼在做什麼
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
這兩行程式碼應該只是在宣告?
就我的理解Java程式的概念是宣告一個Buffer的資料流並直接讀取Buffer的內容
而這個Buffer的資料流是 System.in 這個鍵盤輸入的Buffer
之後再由後面的無限迴圈中的 c=br.read(); 讀取這個Buffer並印出
那麼 照理說成是應該無限的讀取與印出的動作才對
可是為什麼程式會是
→ 等待輸入 → 讀取緩衝 → 印出結果→┐
↑ ↑ │ │
│ └───────┘ │
└────────────────┘ (這是程式真實的狀況)
就我的理解 無限迴圈應該是上面紫色的部分
那個關於 輸入的這個動作 是存在哪個指令當中? 為什麼也被包含在無限迴圈當中?
那就更奇怪啦~~也就是我問題的癥結點...
read()持續的讀取字元直到讀到 10 的這個結束字元
表示是無限迴圈所造成的結果
那麼 到10結束後 應該就是無限讀取空的Buffer
怎麼會是等待輸入?
我唯一能想到的是 read() 包含輸入緩衝 同時 監聽鍵盤輸入 的功能?
還是說我對於緩衝區的了解錯了?
希望有人能為我解釋一下
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.192.84.168
※ 編輯: rps12369 來自: 123.192.84.168 (01/29 18:28)
※ 編輯: rps12369 來自: 123.192.84.168 (01/29 18:30)
※ 編輯: rps12369 來自: 123.192.84.168 (01/29 18:31)
※ 編輯: rps12369 來自: 123.192.84.168 (01/29 18:36)
推
01/29 18:32, , 1F
01/29 18:32, 1F
推
01/29 21:22, , 2F
01/29 21:22, 2F
所以說...waiting for input stream
嗯...那也就是說
如果緩衝區是空的 那就會 waiting 也就是像j大所說的像是getchar
如果緩衝區不是空的 就會解除暫停繼續讀取緩衝區和程式內容
是這樣子嗎@@?
※ 編輯: rps12369 來自: 123.192.84.168 (01/29 21:42)
※ 編輯: rps12369 來自: 61.230.90.19 (01/30 00:00)
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):