java - 我什么时候使用 BufferedInputStream?
问题描述
为什么我用 BufferedInputStream 包装 FileInputStream 并使用read(byte[20])
并让 BufferedInputStream 在内部缓冲 8192 字节以获得性能优势?
相反,我可以使用fileInputStream.read(byte[8192])
对吗?现在,我从不需要使用 BufferedInputStream。
我什么时候使用 BufferedInputStream?我错过了什么吗?当我可以通过 FileInputStream 的大读取获得更好的性能优势时,我从不希望进行较小的读取。在什么情况下,一次读取 20 个字节的小数据?
解决方案
你没有。
BufferedInputStream仅当以下两件事都为真时才是有用的构造:
- 底层输入流(您传递给
BufferedInputStream
构造函数的输入流)使得小型读取效率低下(例如,在达到一定的大尺寸时,所有读取都需要相同的时间,因此小型读取效率低下)。这往往适用于文件,有时适用于网络流。 - 实际上,您打算进行少量阅读。
如果您的代码设置为一次可以读取一个缓冲区负载,那就太好了。不要打扰 BufferedInputStream。这并不总是正确的。例如,如果您正在编写一些简单的二进制格式阅读器,那么您往往会进行大量的小读取。(通常,.read()
,最多只能读取一个字节)。
请注意,.read(byte[])
很难使用:如果将 8192 大小的字节数组传递给此方法,则不必读取所有 8192 字节,即使有 8192 字节要读取:该方法将读取最佳字节数,至少保证1 字节读取(或 0 字节读取和返回值 -1,表示流结束,或者当然是例外),但它不保证最大读取,这使得除了基本“blit”之外的几乎所有读取作业都变得复杂操作(您只需阅读所有内容并将其直接复制到其他内容中)。
如果您正在执行复制操作,请注意存在in.transferTo(out)
- 单行,您甚至不必制作缓冲区,并且将尽可能高效。
还有.readNBytes
,.readFully
如果你需要保证尽可能多的字节可以读取,被读取。
推荐阅读
- r - 如何拥有第二个 y 轴并在其中嵌入折线图
- port - Apache Ambari 未在 hortonworks 沙箱中启动 - 可能 8080 已锁定
- javascript - 如何让我的 withStyles 类在我的 React 应用程序的导出类组件中工作
- powershell - 在powershell cmdlet中调用函数作为参数
- javascript - 在包含可观察对象和字符串 prop/value 的对象数组上使用 forkJoin——保留关联的字符串
- amazon-redshift - 忽略 redshift 存储过程中发生的错误
- ruby-on-rails - RoR Redis 订阅 rspec 存根
- python - 如何使用递归函数返回“真”或假?
- python - 使用按钮从文本框中附加组合框值
- node.js - 在 React 中播放来自 websocket 流的 pcm 音频