BufferedInputStream的用法

Jas*_*ins 35 java bufferedinputstream fileinputstream

让我在这篇文章前面加上一点谨慎.在Java方面,我是一个初学者.我已经开启和关闭了PHP一段时间,但我已经准备好制作一个桌面应用程序,所以我决定使用Java,原因有很多.

我正在处理的应用程序处于开始阶段(少于5个类),我需要从本地文件中读取字节.通常,文件目前小于512kB(但将来可能会变大).目前,我使用a FileInputStream将文件读入三个字节数组,完全满足我的要求.但是,我已经看到了一个BufferedInputStream提到的,并且想知道我目前这样做的方式是最好的,还是我应该使用一个BufferedInputStream.

我做了一些研究,并在Stack Overflow上阅读了一些问题,但是我仍然遇到麻烦,了解何时使用而不使用的最佳情况BufferedInputStream.在我的情况下,我读取字节的第一个数组只有几个字节(小于20).如果我收到的数据在这些字节中是好的,那么我将文件的其余部分读入另外两个不同大小的字节数组.

我也听过很多人提到分析,看看哪个在每个特定情况下哪个更有效,但是,我没有剖析经验,我不确定从哪里开始.我也会喜欢这方面的一些建议.

对于这么长的帖子我很抱歉,但我真的想学习并理解做这些事情的最佳方法.我总是习惯于第二次猜测我的决定,所以我会喜欢一些反馈.谢谢!

Ste*_*n C 80

如果你一直在做小读,那么a BufferedInputStream会给你带来更好的性能.无缓冲流上的每个读取请求通常导致对操作系统的系统调用以读取所请求的字节数.进行系统调用的开销可能是每个系统调用数千个机器指令.缓冲流通过对内部缓冲区执行(例如)高达8k字节的大量读取,然后从该缓冲区分配字节来减少此操作.这可以大大减少系统调用的数量.

但是,如果你一直在进行大量读取(例如8k或更多),那么就会BufferedInputStream减慢速度.您通常不会减少系统调用的数量,缓冲会引入额外的数据复制步骤.

在你的用例中(你首先读取了20个字节的块然后是大量的大块)我会说使用a BufferedInputStream更有可能降低性能而不是增加它.但最终,它取决于实际的阅读模式.

  • 我的[gist](https://gist.github.com/MrCoder/5934250)支持这个答案. (3认同)

Tom*_*ine 5

如果使用相对较大的数组一次读取一个数据块,则BufferedInputStream只会引入浪费的副本。(请记住,read不一定读取所有数组-您可能需要DataInputStream.readFully)。凡BufferedInputStream胜是制作许多小读取时。