Re: [問題] BufferedReader 問題
※ 引述《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
04/16 20:07, 1F
推
04/16 20:13, , 2F
04/16 20:13, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):