作者H45 (!H45)
看板java
标题Re: [问题] BufferedReader 问题
时间Thu Apr 16 20:05:41 2009
※ 引述《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
1F:→ H45:读 OpenJDK Source Code 读到走火入魔 =.= 04/16 20:07
2F:推 a613204:谢谢你的补充 04/16 20:13