首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BufferedInputStream的用法

BufferedInputStream的用法
EN

Stack Overflow用户
提问于 2010-06-26 10:08:04
回答 5查看 21.6K关注 0票数 37

让我在这篇文章的前言中提出一个警告。当涉及到Java时,我完全是一个初学者。我断断续续地编写PHP已经有一段时间了,但我已经准备好做一个桌面应用程序,所以出于各种原因,我决定使用Java。

我正在开发的应用程序还处于初级阶段(少于5个类),我需要从本地文件中读取字节。通常,文件当前小于512kB (但将来可能会变大)。目前,我使用FileInputStream将文件读入三个字节的数组,这很好地满足了我的要求。然而,我看到了一个提到的BufferedInputStream,我想知道我现在做这件事的方式是不是最好,或者我是否应该使用BufferedInputStream

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

我也听过很多人提到分析,看看在每个特定的情况下哪个更有效,然而,我没有分析经验,我真的不确定从哪里开始。我也想要一些关于这方面的建议。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-06-26 10:57:40

如果您一直在进行小读操作,那么BufferedInputStream将为您提供明显更好的性能。未缓存流上的每个读请求通常会导致对操作系统的系统调用,以读取所请求的字节数。执行系统调用的开销可能是每个系统调用数千条机器指令。缓冲流通过对(比方说)高达8k字节的内部缓冲区执行一次大型读取,然后从该缓冲区分发字节来减少这一点。这可以极大地减少系统调用的数量。

但是,如果您一直在进行大读操作(例如8k或更多),则BufferedInputStream会稍微减慢速度。您通常不会减少syscall的数量,并且缓冲引入了额外的数据复制步骤。

在您的用例中(首先读取20字节块,然后读取大量大块),我想说使用BufferedInputStream更有可能降低性能而不是提高性能。但归根结底,这取决于实际的读取模式。

票数 84
EN

Stack Overflow用户

发布于 2010-06-26 10:24:34

如果您使用相对较大的数组一次读取一个块的数据,那么BufferedInputStream只会引入一个浪费的拷贝。(请记住,read不一定读取所有数组--您可能需要DataInputStream.readFully)。BufferedInputStream获胜的地方是在进行大量小读操作时。

票数 5
EN

Stack Overflow用户

发布于 2010-06-26 10:20:48

BufferedInputStream会提前读取更多您需要的文件。据我所知,它提前做了更多的工作,比如,1个大的连续磁盘读取,而不是在一个紧凑的循环中做很多次。

至于分析--我喜欢netbeans内置的分析器。它真的很容易上手。:-)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3122422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档