被占用名字的某人 2024-06-28 17:08 采纳率: 100%
浏览 1
已结题

关于io流发现的一点奇特的问题

关于io流 字节流与字节缓冲流
字节缓冲流比字节流块是因为减少了io次数,但如果让他们去读同一文件,且都用byte[]作缓冲,那么理论上来说他们的io次数相同,为什么缓冲流还是会比字符流快

img

img

img

可以看到,当用byte[1024]时缓冲流明显比字节流快一些

img


当byte[2048]时缓冲流与字节流相较于1024都加快,但缓冲流还是快于字符流,我从1kb-8kb挨个试了下(缓冲流上限是8kb)都是缓冲流快于字符流的,但是当在byte[5122](随便输入的不是整数kb)的时候,缓冲流所要的时间会变得大于字符流所需时间,这种现象又是为什么。
总结问题:
相同文件读写 FileInputStream.reader(byte[]),FileOutputStream.writer(byte[]) 与 BufferedInputStream.reader(byte[]),BufferdOutputStream.writer(byte[])相比,byte[]相同,在长度小于8kb时为什么会慢?当数组长度不是整数kb时,为什么Buffered所用时间会明显变大?
求佬佬解答

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-28 17:10
    关注

    引自免费微信小程序:皆我百晓生

    关于你的问题,我们可以从以下几个方面进行分析和解答:

    1. 字节缓冲流与字节流的速度差异

    字节缓冲流(如BufferedInputStreamBufferedOutputStream)通过内部缓冲区减少了实际的IO操作次数,从而提高了数据读写效率。当你使用字节流(如FileInputStreamFileOutputStream)和字节缓冲流对同一文件进行读写,且使用相同的byte[]作为缓冲区时,字节缓冲流通常会更快,因为它减少了操作系统层面上的IO次数。

    2. 缓冲区大小的影响

    缓冲区的大小确实会影响数据读写的速度。当缓冲区大小适中时(通常是文件块大小的整数倍),可以更有效地利用操作系统的缓存机制,减少实际的磁盘操作次数。但是,缓冲区大小并不是越大越好。如果缓冲区过大,可能会浪费内存资源,并且可能导致更多的上下文切换和内存管理开销。

    3. 非整数KB缓冲区大小的影响

    当缓冲区大小不是整数KB时,可能会出现效率下降的情况。这可能是因为缓冲区的管理和分配机制在内部更加复杂。当缓冲区大小不是预定义的最佳块大小时,系统可能需要更多的时间来处理缓冲区的分配和管理,这可能会导致性能下降。此外,非标准的缓冲区大小可能会导致数据的不连续存储,这也可能影响读写效率。

    总结

    • 字节缓冲流通常比字节流更快,因为它们减少了IO次数。
    • 缓冲区大小的选择很重要,应该根据实际情况选择适当的缓冲区大小。通常,缓冲区大小应该是磁盘块大小的整数倍,以充分利用操作系统的缓存机制。
    • 当缓冲区大小不是整数KB时,可能会出现效率下降的情况,因为内部处理机制可能更加复杂。

    关于你的代码示例中的计时部分,需要注意的是,计时应该更加精确以避免误差。例如,你可以使用System.nanoTime()来计时,它比System.currentTimeMillis()更准确。此外,计时应该包括所有相关的操作,包括文件的打开、关闭等,以确保结果的准确性。

    希望这些解释能帮助你理解这个问题!如果你还有其他疑问或需要进一步的解释,请随时提问。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月6日
  • 已采纳回答 6月28日
  • 创建了问题 6月28日

悬赏问题

  • ¥15 fluent里模拟降膜反应的UDF编写
  • ¥15 MYSQL 多表拼接link
  • ¥15 关于某款2.13寸墨水屏的问题
  • ¥15 obsidian的中文层级自动编号
  • ¥15 同一个网口一个电脑连接有网,另一个电脑连接没网
  • ¥15 神经网络模型一直不能上GPU
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout