当前位置: 首页 > 知识库问答 >
问题:

FileInputStream是逐字节读取还是逐块读取?

后树
2023-03-14

bufferedinputstream(BIS)比FileInputStream(FIS)快的原因请参见“为什么使用bufferedinputstream逐字节读取文件比使用FileInputStream快?”?是吗

使用BufferedInputStream,该方法委托给重载read()方法,该方法读取8192个字节,并在FIS读取单个字节时缓冲它们,直到需要它们

据我所知,磁盘是一个“块设备”。磁盘总是要读/写整个数据块,即使读请求的数据量较小。不是吗?所以,即使FIS和BIS都将读取完整的块而不是单个字节(如FIS所述)。正当那么,国际清算银行如何比金融机构更快呢?

共有1个答案

长孙逸仙
2023-03-14

InputStream的JavaAPI就是这样。具体来说,它有以下方法:

int read() throws IOException

它读取一个字节(它返回一个int,因此可以返回-1来表示EOF)。

因此,如果您尝试从文件中读取单个字节,它将尝试这样做。对于像硬盘这样的块设备,它可能会读取整个块,然后夹住除一个字节以外的所有内容,因此,如果你调用read()方法8192次,它会一遍又一遍地读取同一块,8192次,每次都会夹住8191个字节,给你想要的。因此,在整个过程中读取6700万字节。哎哟效率不高。

考虑到内核、CPU、磁盘等都是以8192的块大小读取的,如果您使用以下内容,则BufferedInputStream(new FileInputStream)new FileInputStream之间的性能差异为零:

byte[] buffer = new byte[8192];
in.read(buffer);

现在,即使是普通的jane unbufferednew FileInputStream也只能从磁盘上读取一次该块。

即使您使用单字节形式的read(),BufferedInputStream也会在引擎盖下执行此操作,然后将从该字节数组中为下一个8191调用read()提供数据。这就是BufferedInputStream所做的一切。

如果您使用的是read()(一次一个字节)变体(或read的字节数组变体,但字节数组非常小),那么BufferedInputStream是有意义的。否则,那什么也做不了,也没有必要把它放在那里。

注:据我所知,java不会猜测磁盘缓冲区的大小,只是使用了一些合理的缓冲区大小。效果是一样的:如果每次使用单字节,将文件流包装到bufferedstream中可以将性能提高1000倍,如果使用字节数组变量,则没有任何区别。

 类似资料:
  • 问题内容: 我想逐个读取文件。该文件分为几部分,分别存储在不同类型的媒体上。我目前要做的是调用文件的每个单独部分,然后将其合并回原始文件。 问题是我需要等到所有块都到达后才能播放/打开文件。是否有可能在块到达时读取块,而不是等待它们全部到达。 我正在处理媒体文件(电影文件)。 问题答案: 您要的是源数据线。当数据太大而无法一次将其保存在内存中时,这是完美的选择,因此您可以在接收整个文件之前开始播放

  • 我正在努力阅读附加的TXT文件,以csv形式显示从文件中读取的每个字段,我做了一个接近我想要的代码,但我没有前进。 TXT文件格式: 我的代码在我想要的位置读取第一行,但下面的行我不能,更不用说重复文件中包含的下一个工资单的读数了。 目前的输出是这样的: 出口应该是怎样的 逐行读取和捕获数据,我必须完成一个工资单,它将在输出中形成一行,第二个工资单将在输出中形成第二行,因此,直到txt文件结束,此

  • 问题内容: 给定一个不太长的字符串,逐行读取字符串的最佳方法是什么? 我知道你可以做: 另一种方法是在eol上获取子字符串: 还有其他更简单的方法吗?我对上述方法没有任何问题,只是想知道你们中是否有人知道一些看起来更简单,更有效的方法? 问题答案: 您也可以使用String方法: 这使您可以方便地将所有行排列在一起。 我不知道拆分的性能。它使用正则表达式。

  • 问题内容: 我有一个.gz格式的文件。读取此文件的Java类是GZIPInputStream。但是,此类不会扩展Java的BufferedReader类。结果,我无法逐行读取文件。我需要这样的东西 尽管我创建了扩展java的Reader或BufferedReader类并使用GZIPInputStream作为其变量之一的类。 但是,这在我使用时不起作用 有人可以建议如何进行.. 问题答案: 装饰器的

  • 稳定性: 2 - 稳定的 require('readline') 模块提供了一个接口,用于从可读流(如 process.stdin)读取数据,每次读取一行。 它可以通过以下方式使用: const readline = require('readline'); 例子,readline 模块的基本用法: const readline = require('readline'); const rl

  • 我试图使用FileInputStream将一个文件读入数组,一个~800KB的文件读入内存大约需要3秒钟。然后,我尝试了相同的代码,只是将FileInputStream包装到BufferedInputStream中,耗时约76毫秒。为什么使用BufferedInputStream一个字节一个字节地读取文件要快得多,即使我仍在一个字节一个字节地读取它?下面是代码(其余代码完全无关)。请注意,这是“快