BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #55186同步于 2017/2/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

求问Java IO的buffer(包装类) 和NIO的buffer有什么区别?

MrSky
2017/2/25镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
ml3615556机器人#1 · 2017/2/26
bio有buffer类吗?刚瞟了一眼,只有nio包里面有Buffer Buffer就是NIO模型buffer的实现吧
MrSky机器人#2 · 2017/2/26
我是说包装类 例如 BufferedInputStream 它也是有缓存功能的,当使用read()方法时,实际上是先读取buf中的数据,而不是直接对数据来源一个字节一个字节的作读取, 这样的话在读取速度上 是不是和NIO 的buffer是一样的。 【 在 ml3615556 的大作中提到: 】 : bio有buffer类吗?刚瞟了一眼,只有nio包里面有Buffer : Buffer就是NIO模型buffer的实现吧
ml3615556机器人#3 · 2017/2/27
这个比较其实很不公平,stream模型大致对应nio的channel模型,配合stream工作的buffer数组才跟Buffer类对应。 BufferedXXXStream实际上就是申请了一个buffer数组而已。 buffer跟Buffer不是bio跟nio的主要问题。 如果read的时候stream的buffer已经准备好了,而且nio中Buffer也准备好了,那么这俩都是读内存(除了MappedByteBuffer),那么区别也就不大。单线程读文件、socket下,bio跟nio可以说是55开(都受限于磁盘io速度)。 关键是,stream模型是阻塞的,而selector + channel的模型可以是非阻塞的。多线程环境下,nio读取多个channel的性能是好很多的。 【 在 MrSky 的大作中提到: 】 : 我是说包装类 例如 BufferedInputStream 它也是有缓存功能的,当使用read()方法时,实际上是先读取buf中的数据,而不是直接对数据来源一个字节一个字节的作读取, 这样的话在读取速度上 是不是和NIO 的buffer是一样的。
MrSky机器人#4 · 2017/2/27
先抛开阻塞与非阻塞问题 。但就两者都可以缓存这个角度做比较。 我的理解两者都是1、在内存申请缓存区,2、然后进行磁盘io,当缓存区满了之后程序会一次性读取buffer中 的数据。那么既然1的速度是区别不大的 那么读取相同的数据 磁盘io的速度两者肯定也是一样吧。这样理解的话 是不是他们在读取数据的速度上其实是一致的。问这个问题的原因是因为 我在网上看到 这么一句话: “Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方”。 如果算上stream模型中带buffer的包装类 这句话是不是有问题?stream的包装类一样可以一次性读取buffer容量个字节缓存起来吧 不知道我这么理解对不对 求解答[ema1]
ml3615556机器人#5 · 2017/2/27
“Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方”。 不要那么死板,人家为了让你好用一点,别自己去做缓存,才给你提供了一个BufferedXXXStream...不要因此去怀疑这句话说错了。 顺便说一句,没有缓存在任何地方应该是不对的。只能说没有缓存在java内存中的任何地方 【 在 MrSky 的大作中提到: 】 : 先抛开阻塞与非阻塞问题 。但就两者都可以缓存这个角度做比较。 : 我的理解两者都是1、在内存申请缓存区,2、然后进行磁盘io,当缓存区满了之后程序会一次性读取buffer中 : 的数据。那么既然1的速度是区别不大的 那么读取相同的数据 磁盘io的速度两者肯定也是一样吧。这样理解的话 : ...................