java io流中为什么使用缓冲流就能加快文件读写速度

news/2024/7/24 8:45:09 标签: 网络, 服务器, 运维

FileInputStream的read方法底层确实是通过调用JDK层面的read方法,并且这个JDK层面的read方法底层是使用C语言编写的,以实现高效的文件读取功能。但是它会涉及多次内核态与操作系统交互。当我们使用FileInputStream的read方法读取文件时,首先会触发一次用户态到内核态的切换。这是因为文件读取是一个底层的系统调用,需要在内核态执行。内核态具有更高的权限和更直接的访问硬件的能力。

在内核态中,操作系统会执行相应的文件读取操作,将文件中的数据读取到内核缓冲区中。然后,操作系统再将数据从内核缓冲区复制到Java的用户空间中,最终返回给我们的Java程序。

这个过程中涉及了多次内核态与操作系统的交互,包括用户态到内核态的切换、内核态中的文件读取操作以及内核态到用户态的数据复制。每次内核态与操作系统的交互都需要一定的时间开销,所以在大量的文件读取操作中,减少内核态与操作系统的交互次数可以提高性能。

介绍 

在文件读取方面,FileInputStream和BufferedInputStream都有各自的优缺点。

FileInputStream是一个基于字节的输入流,它从文件中读取字节数据。使用FileInputStream读取文件时,每次读取都会直接从磁盘中读取一个字节,这样会导致频繁的磁盘I/O操作,从而影响文件读取的效率。

BufferedInputStream则是一个基于字节的缓冲输入流,它利用了缓冲区的机制,每次读取一定量的数据到缓冲区中,然后逐个字节地将数据从缓冲区中读取。因为缓冲区可以预读数据并存储在内存中,所以可以减少磁盘I/O次数,从而提高文件读取的效率。

所以,在读取大文件时,使用BufferedInputStream比FileInputStream更高效,因为它减少了频繁的磁盘I/O操作。但是在读取小文件时,由于缓冲区需要耗费一定的时间来填充,可能会出现BufferedInputStream比FileInputStream慢的情况。

综上所述,选择FileInputStream还是BufferedInputStream,要根据具体的情况来考虑,如果需要读取大文件,使用BufferedInputStream更加高效;如果需要读取小文件,使用FileInputStream可能更快一些。

Java I/O中的缓冲流能够加快文件读写速度的根本原因是

将输入/输出流封装在缓冲区内,在缓冲区中进行读写操作,减少了磁盘或网络I/O的次数,提高了读写效率。

具体来说,BufferedInputStream是一种基于字节的缓冲输入流,它利用了缓冲区的机制,每次读取数据时会先将一定量的数据读入缓冲区,然后逐个字节地将数据从缓冲区中读取。当缓冲区中的数据被读完之后,它会再次从输入流中读取一定量的数据到缓冲区中,继续读取操作。

使用缓冲流读取文件时,它会将文件的一部分数据读取到内存中的缓冲区里,然后程序再从缓冲区中逐一读取数据,这样就避免了每次都直接读取硬盘或网络的I/O操作,从而加快了文件的读取速度。

此外,缓冲流还可以减少系统调用的次数,因为每一次系统调用都需要向操作系统申请资源并返回结果,耗费时间较长。而使用缓冲流可以将多个小的I/O操作合并成一个大的操作,从而减少了系统调用的次数,提高了程序的运行效率。

综上所述,使用缓冲流能够加快文件读写速度的根本原因就是通过缓存数据,减少I/O操作。而BufferedInputStream作为一种基于字节的缓冲输入流,可以有效地实现这一目的。

统计表 

 因为采用不同的缓冲区大小时,数据的传输总量(因此招致磁盘操作的数量)是相同的,表所示为发起read和writel调用的开销。缓冲区大小为1字节时,需要调用read)和write1亿次,缓冲区大小为4096个字节时,需要调用read)和writel24000次左右,几平达到最优性能。设置再超过这个值,对性能的提升就不显著了,这是因为与在用户空间和内核空间之间复制数据以及执行实际磁盘l/0 所花费的时相比,read()和write()系统调用的成本就显得微不足道了

在Java中使用流进行文件上传有几个好处

1. 内存效率:使用流可以一次仅将文件的一部分读入内存,而不需要一次性将整个文件读入内存。这对于大型文件尤其重要,因为它可以节省内存并避免OutOfMemoryError。

2. 网络传输:在文件上传到服务器或从服务器下载时,流可以直接在网络上传输,而不需要将整个文件加载到内存中,可以降低网络传输的延迟。

3. 实时处理:流使得文件可以在传输过程中进行实时处理,例如压缩、加密、解密或其他操作,而无需等待整个文件传输完成。

4. 扩展性:流提供了丰富的API和功能,可以方便地对文件进行读取、写入和处理,同时支持各种类型的文件操作。


http://www.niftyadmin.cn/n/5201822.html

相关文章

LeetCode热题100——贪心算法

贪心算法 1. 买卖股票最大利润2. 跳跃游戏3. 跳跃游戏Ⅱ 1. 买卖股票最大利润 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一…

【数据结构(四)】栈(1)

文章目录 1. 关于栈的一个实际应用2. 栈的介绍3. 栈的应用场景4. 栈的简单应用4.1. 思路分析4.2. 代码实现 5. 栈的进阶应用(实现综合计算器)5.1. 栈实现一位数计算(中缀表达式)5.1.1. 思路分析5.1.2. 代码实现 5.2. 栈实现多位数计算(中缀表达式)5.2.1. 解决思路5.2.2. 代码实…

Jenkins 下载安装

下载 Jenkins 选择Download LTS是稳定版本,尽量选择稳定版本,然后选择你的开发系统. 安装 Jenkins需要JAVA环境,所以安装JAVA环境 Java Jenkins支持17、21等几个版本的Java,OpenJDK JDK 21.0.1 GA Release 安装不要安装到C盘,这个后面会占较大的…

基于C#实现AC自动机算法

我要检查一篇文章中是否有某些敏感词,这其实就是多模式匹配的问题。当然你也可以用 KMP 算法求出,那么它的时间复杂度为 O(c*(mn)),c:为模式串的个数。m:为模式串的长度,n:为正文的长度,那么这个复杂度就不…

学习Rust适合写什么练手项目?【云驻共创】

Rust是一门备受关注的系统级编程语言,因其出色的内存安全性、高性能和并发性能而备受赞誉。对于那些希望学习和掌握Rust编程语言的人来说,练手项目是一个不可或缺的环节。通过实际动手完成项目,你可以加深对Rust语言特性和最佳实践的理解&…

微机原理_15

一、单项选择题(本大题共 15 小题,每小题 3 分,共 45分。在每小题给出的四个备选项中,选出一个正确的答案。 以下叙述正确的() A.微机的字长可以是8、16、24、32位 B.微机的字长可以是8、16、32、64位 C.微…

Windows系统如何安装与使用TortoiseSVN客户端,并实现在公网访问本地SVN服务器

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统,它与Apache Subversion(SVN)集成在一起,提供了一个用户友好的界面,方便用…

【libGDX】使用Mesh绘制三角形

1 Mesh 和 ShaderProgram 简介 1.1 创建 Mesh 1)Mesh 的构造方法 public Mesh(boolean isStatic, int maxVertices, int maxIndices, VertexAttribute... attributes) public Mesh(boolean isStatic, int maxVertices, int maxIndices, VertexAttributes attribut…