V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Frankhong
V2EX  ›  Java

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

  •  
  •   Frankhong · 2020-08-26 18:00:33 +08:00 · 2275 次点击
    这是一个创建于 1578 天前的主题,其中的信息可能已经有所发展或是发生改变。
    6 条回复    2020-08-27 09:49:23 +08:00
    codehz
        1
    codehz  
       2020-08-26 19:31:34 +08:00   ❤️ 3
    虽然这问题标记了 java,但是这个概念可不仅仅是 java 才有的

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

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

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

    你的方案 = Reader + 数组缓冲

    所以:

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

    readLine()必须要有缓存 Buffer 机制,试想如果一次读一个字符,直到读到\r\n,那 IO 操作太频繁了;如果一次读 N 个字符,如果中间遇到了\r\n 后面的咋办,肯定不能丢,倒不如弄个 Buffer 存进去
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2565 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:43 · PVG 18:43 · LAX 02:43 · JFK 05:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.