BufferedReader 和 Reader 的差别在于前者有缓冲区,但是 Reader 不是可以用数组来读吗?那么使用 BufferedReader 和 read(byte[] bytes)有什么区别呢?
資深大佬 : Frankhong 8
虽然这问题标记了 java,但是这个概念可不仅仅是 java 才有的
直接读的时候不一定能把内核提供的缓冲区读完,然后就得多次读,这样性能方面就会有问题,如果加个用户态的 buffer,就可以在检测到能读的时候尽可能多读一些,这样总的系统调用数量就会少很多(系统内是有缓冲机制,但是你每次去取,都需要额外的系统调用,一个系统调用的时间,可比你只复制内存慢多了)。
假设数据一次性到达 4096 字节,你一个字节一个字节读取,就要 4096 次系统调用,而有了用户态的缓冲区,就可以只发一次调用,然后后续的读就是内存复制了。
当然理论上如果你能控制到达数据的量的时候,是可以不用这样做的(然后更加高效),但是通常你是控制不了的,尤其是 tcp,就算你发送端以 1 字节为单位发,接收端也不一定能一次只收到一字节。。
大佬有話說 (5)