缓冲输入流的用法

让我在这篇文章的开头谨慎一点。在Java方面,我是一个完全的初学者。我已经断断续续地编写PHP一段时间了,但是我准备制作一个桌面应用程序,所以我出于各种原因决定使用Java。

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

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

我还听到很多人提到分析,看看在每个特定情况下哪个更有效,但是,我没有分析经验,我真的不确定从哪里开始。我也希望对此提出一些建议。

我很抱歉这么长的帖子,但我真的很想学习和理解做这些事情的最佳方法。我总是有一个坏习惯,就是猜测我的决定,所以我很想得到一些反馈。谢谢!


答案 1

如果您一直在进行小的读取,那么a将为您提供更好的性能。无缓冲流上的每个读取请求通常都会导致系统调用操作系统以读取请求的字节数。执行系统调用的开销可能是每个系统调用数千条机器指令。缓冲流通过对内部缓冲区执行一次(例如)最多8k字节的大读取,然后从该缓冲区分发字节来减少这种情况。这可以大大减少系统调用的数量。BufferedInputStream

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

在你的用例中(你先读一个20字节的块,然后读很多大块),我会说使用a更有可能降低性能而不是提高它。但最终,这取决于实际的读取模式。BufferedInputStream


答案 2

如果你使用一个相对较大的数组来一次读取一个块的数据,那么只会引入一个浪费的副本(记住,不一定读取所有的数组 - 你可能想要)。获胜的地方是当进行大量小的读取时。BufferedInputStreamreadDataInputStream.readFullyBufferedInputStream


推荐