BufferedReader 和 Reader 的差别在于前者有缓冲区,但是 Reader 不是可以用数组来读吗?那么使用 BufferedReader 和 read(byte[] bytes)有什么区别呢?

2020-08-26 18:00:33 +08:00
 Frankhong
2247 次点击
所在节点    Java
6 条回复
codehz
2020-08-26 19:31:34 +08:00
虽然这问题标记了 java,但是这个概念可不仅仅是 java 才有的

直接读的时候不一定能把内核提供的缓冲区读完,然后就得多次读,这样性能方面就会有问题,如果加个用户态的 buffer,就可以在检测到能读的时候尽可能多读一些,这样总的系统调用数量就会少很多(系统内是有缓冲机制,但是你每次去取,都需要额外的系统调用,一个系统调用的时间,可比你只复制内存慢多了)。

假设数据一次性到达 4096 字节,你一个字节一个字节读取,就要 4096 次系统调用,而有了用户态的缓冲区,就可以只发一次调用,然后后续的读就是内存复制了。

当然理论上如果你能控制到达数据的量的时候,是可以不用这样做的(然后更加高效),但是通常你是控制不了的,尤其是 tcp,就算你发送端以 1 字节为单位发,接收端也不一定能一次只收到一字节。。
taogen
2020-08-26 21:08:23 +08:00
类的方法更多,功能更丰富,建议阅读 Java API 文档
anthow
2020-08-26 23:43:32 +08:00
laminux29
2020-08-26 23:50:07 +08:00
BufferedReader = Reader + 缓冲 + 一堆其他乱七八糟的功能。

你的方案 = Reader + 数组缓冲

所以:

BufferedReader = 你的方案 + 除开数组的其他方式设计的缓冲 + 一堆其他乱七八糟的功能。
yiyi11
2020-08-27 08:23:56 +08:00
BufferdReader 相当于封装了一个更好用的 Reader,比如最常用的按行读取文件,BufferredReader 直接提供 readLine 的方法,用 Reader 就只能自己实习逻辑了。
qwerthhusn
2020-08-27 09:49:23 +08:00
相比 Reader,BR 提供的额外功能不多,主要是 lines()和 readLine()

readLine()必须要有缓存 Buffer 机制,试想如果一次读一个字符,直到读到\r\n,那 IO 操作太频繁了;如果一次读 N 个字符,如果中间遇到了\r\n 后面的咋办,肯定不能丢,倒不如弄个 Buffer 存进去

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/701673

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX