Re: [問題] BufferedReader 問題

看板java作者 (!H45)時間16年前 (2009/04/16 20:05), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串3/3 (看更多)
※ 引述《jtmh ()》之銘言: : ※ 引述《a613204 (胖胖)》之銘言: : : 請問一下這一句程式碼的解釋 : : BufferedReader buf=new BufferedReader(new InputStreamReader(System.in)) : : 建立輸入串流物件 System.in : : 由InputStreamReader 將位元串流轉成字元串流 : : 使用BufferedReader 緩衝區是為了提升效能 減少I/O存取 : : 因為之前看書有些沒解釋得很清楚,這是在網路上查到並整理過後的概念 : : 有三個問題想請問一下 : : (1)請問這樣解釋有錯嗎?? :   據我所知 System.in 應該是早就建立好的, :   你是直接拿來用而已。 : : (2)如果解釋沒錯,想請問存入緩衝區的詳細過程是怎樣呢?? :   BufferedReader 會自己在記憶體中 maintain 一塊 buffer, :   當你用它的 method 去讀取資料時, :   如果 buffer 中還有足夠的資料, :   它就直接把 buffer 中的資料回傳給你; :   否則,它才會真正向底層系統發出讀取請求, :   並一次讀滿整個 buffer 的資料。 : : (3)將位元串流轉成字元串流 是指在輸入的時候,程式讀取輸入的時候是以位元組 : : 方式讀取嗎?? :   System.in 的確是以位元組方式讀取。 為了避免誤會,補充一下 System.in 是 static 運行期建立完成的 雖然 System.in 是 final, 但實際上卻是以 JNI 做 native call 得到非 null 實體 若無例外,System.in 的實體是 BufferedInputStream 包著一個 FileInputStream 而預設的 Buffer size 是 8192 個位元組。 FileInputStream 做一次 read() 隨即呼叫一個 native 函式 該函式回傳的型態是 int (32位元) 但實際上只有一個 byte 的效果 別忘記 System.in 的實體是 BufferedInputStream 所以做一次 read() 還是會填滿內存的 buffer (8192 bytes) -- 我擅長把事情複雜化 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.116.247.13

04/16 20:07, , 1F
讀 OpenJDK Source Code 讀到走火入魔 =.=
04/16 20:07, 1F

04/16 20:13, , 2F
謝謝你的補充
04/16 20:13, 2F
文章代碼(AID): #19vnyMqx (java)
文章代碼(AID): #19vnyMqx (java)