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

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.mzph.cn/news/156883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UEC++ day7

敌人NPC机制 敌人机制分析与需求 新建一个character类来作为敌人,直接建蓝图设置骨骼网格,因为敌人可能多种就不规定死,然后这个敌人肯定需要两个触发器,一个用于大范围巡逻,一个用于是否达到主角近点进行攻击 注意我…

【Flink】Process Function

目录 1、ProcessFunction解析 1.1 抽象方法.processElement() 1.2 非抽象方法.onTimer() 2、Flink中8个不同的处理函数 2.1 ProcessFunction 2.2 KeyedProcessFunction 2.3 ProcessWindowFunction 2.4 ProcessAllWindowFunction 2.5 CoProcessFunction 2.6 ProcessJo…

https和http的区别和优势

大家好,我是咕噜-凯撒,HTTP(超文本传输协议)和HTTPS(安全超文本传输协议)是用于在网络上传输数据的协议,HTTPS相比HTTP在数据传输过程中更加安全可靠,适合对数据安全性要求较高的场景…

ventoy安装操作系统

下载ventoy https://github.com/ventoy/Ventoy/releases/download/v1.0.96/ventoy-1.0.96-windows.zip 解压后执行 Ventoy2Disk 2、安装后将ISO放入U盘大的分区,通过U盘启动就可以识别到ISO镜像开始装系统

MySQL 日志管理、备份与恢复

一、MySQL 日志管理 MySQL 的日志默认保存位置为 /usr/local/mysql/data vim /etc/my.cnf [mysqld] ##错误日志,用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启 log-error/usr/local/mysql/data/mysql_error.log #指定日志的保存位置…

PDF控件Spire.PDF for .NET【转换】演示:将 PDF 转换为 word、HTML、SVG、XPS

本文我们将演示如何通过调用 Spire.PDF 提供的方法 PdfDocument.SaveToStream() 将 PDF 页面转换为 HTML、Word、SVG、XPS、PDF 并将它们保存到流中。并且从Spire.PDF版本4.3开始,它新支持转换定义范围的PDF页面并将其保存到流中。 Spire.Doc 是一款专门对 Word 文…

springboot项目基于jdk17、分布式事务seata-server-1.7.1、分库分表shardingSphere5.2.1开发过程中出现的问题

由于项目需要,springboot项目需基于jdk17环境开发,结合nacos2.0.3、分布式事务seata-server-1.7.1、分库分表shardingSphere5.2.1等,项目启动过程中出现的问题解决方式小结。 问题一: Caused by: java.lang.RuntimeException: j…

职场Excel:求和家族,不简单

说到excel函数,很多人第一时间想到的就是求和函数sum。作为excel入门级函数,sum的确是小白级的,以至于很多人对求和函数有点“误解”,觉得求和函数太简单了。 但是,你可能不知道,sum只是excel求和家族里的一…

【打卡】牛客网:BM59 N皇后问题

自己写的&#xff1a; ①想自己定义结构体node&#xff0c;发现find函数太麻烦。看了眼模板&#xff0c;就用一个vector<int>记录行号就行&#xff0c;索引自然而然就是列号。 ②想用for循环写&#xff08;未通过&#xff09; 还在想这和模拟差不多。后来才意识到&…

Ubuntu22.04 交叉编译GCC13.2.0 for Rv1126

一、安装Ubuntu22.04 sudo apt install vim net-tools openssh-server 二、安装必要项 sudo apt update sudo apt upgrade sudo apt install build-essential gawk git texinfo bison flex 三、下载必备软件包 1.glibc https://ftp.gnu.org/gnu/glibc/glibc-2.38.tar.gz…

引迈-JNPF低代码项目技术栈介绍

从 2014 开始研发低代码前端渲染&#xff0c;到 2018 年开始研发后端低代码数据模型&#xff0c;发布了JNPF开发平台。 谨以此文针对 JNPF-JAVA-Cloud微服务 进行相关技术栈展示&#xff1a; 1. 项目前后端分离 前端采用Vue.js&#xff0c;这是一种流行的前端JavaScript框架&a…

Doris的分区表和分桶表

1 列定义 以AGGREGATE KEY数据模型为例进行说明。更多数据模型参阅Doris数据模型。 列的基本类型,可以通过在mysql-client中执行HELP CREATE TABLE; 查看。 AGGREGATE KEY数据模型中,所有没有指定聚合方式(SUM、REPLACE、MAX、MIN)的列视为Key列。而其余则为Value列。 定义…

SQLServer 数字加千分位 用FORMAT函数强转不管多大位数

问题 CONVERT ( money, CONVERT ( money, CAST ( round( FTP_AMOUNT, 2 ) AS NUMERIC ( 20, 2 ) ) ) 1 ) AS FTP_AMOUNT用的money函数 结果空间不足&#xff0c;无法将 money 值转换为 varchar。 可以强转 select FORMAT(CAST ( round( ‘-8926143870680.62000000’, 2 ) AS N…

Java WebSocket框架

引言 随着互联网和移动互联网的迅猛发展&#xff0c;实时通信成为了应用程序的一项重要能力。WebSocket作为一种在Web上实现双向通信的协议&#xff0c;极大地丰富了Web应用程序的交互方式。而在Java领域&#xff0c;也有许多优秀的WebSocket框架可供选择&#xff0c;本文将介…

4D毫米波雷达和3D雷达、激光雷达全面对比

众所周知&#xff0c;传统3D毫米波雷达存在如下性能缺陷&#xff1a; 1&#xff09;静止目标和地物杂波混在一起&#xff0c;难以区分&#xff1b; 2) 横穿车辆和行人多普勒为零或很低&#xff0c;难以检测&#xff1b; 3) 高处物体和地面目标不能区分&#xff0c;容易造成误刹…

从CNN到Transformer:基于PyTorch的遥感影像、无人机影像的地物分类、目标检测、语义分割和点云分类

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。随着小卫星星座的普及&#xff0c;对地观测已具备多次以上的全球覆盖…

CentOS上搭建SVN并自动同步至web目录

一、搭建svn环境并创建仓库&#xff1a; 1、安装Subversion&#xff1a; yum install svn2、创建版本库&#xff1a; //先建目录 cd /www mkdir wwwsvn cd wwwsvn //创建版本库 svnadmin create xiangmumingcheng二、创建用户组及用户&#xff1a; 1、 进入版本库中的配…

部署单仓库多目录项目

部署单仓库多目录项目 文章目录 部署单仓库多目录项目1.部署单仓库多目录项目2.Shell脚本进行部署单仓库多目录项目2.1 编写Shell脚本2.2 Demo推送代码及测试 3.小结 1.部署单仓库多目录项目 #部署单仓库多目录项目 在开发过程中,研发团队往往会将一个大型项目拆分成几个子目录…