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

news2024/9/25 1:41:07

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.coloradmin.cn/o/1236678.html

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

相关文章

Java并发编程第12讲——cancelAcquire()流程详解及acquire方法总结

上篇文章介绍了AQS的设计思想以及独占式获取和释放同步状态的源码分析,但是还不够,一是感觉有点零零散散,二是里面还有很多细节没介绍到——比如cancelAcquire()方法(重点),迫于篇幅原因,今天就…

[超详细]基于YOLO&OpenCV的人流量统计监测系统(源码&部署教程)

1.图片识别 2.视频识别 [YOLOv7]基于YOLO&Deepsort的人流量统计系统(源码&部署教程)_哔哩哔哩_bilibili 3.Deepsort目标追踪 (1)获取原始视频帧 (2)利用目标检测器对视频帧中的目标进行检测 &#xff08…

MAX/MSP SDK学习04:Messages selector的使用

其实消息选择器在simplemax示例中就接触到了,但这文档非要讲那么抽象。目前为止对消息选择器的理解是:可判断接收过来的消息是否符合本Object的处理要求,比如加法对象只可接收数值型的消息以处理,但不能接收t_symbol型的消息&…

2024电脑录屏软件排行第一Camtasia喀秋莎

真的要被录屏软件给搞疯了,本来公司说要给新人做个培训视频,想着把视频录屏一下,然后简单的剪辑一下就可以了。可谁知道录屏软件坑这么多,弄来弄去头都秃了,不过在头秃了几天之后,终于让我发现了一个值得“…

ck 配置 clickhouse-jdbc-bridge

背景 ck可以用过clickhouse-jdbc-bridge技术来直接访问各数据库 安装配置 需要准备的文件 clickhouse-jdbc-bridge https://github.com/ClickHouse/clickhouse-jdbc-bridge 理论上需要下载源码然后用mavne打包,但提供了打包好的,可以推测用的是mave…

层层剥开Android14升级后异常弹框的神秘面纱

本篇文章将会通过研究源码的方式给您讲述Android系统升级到Android14后出现的两个异常弹框并给出消除它们的方案。闲话少叙,我们开始。 问题描述 在Android 14升级后,出现两个弹窗的异常情况。这里是异常的截图: 接下来,我们对这…

1-verilog的串行滤波器FIR实现

verilog的串行滤波器FIR实现 1,RTL代码2,RTL原理框图3,测试代码4,输出FIR滤波器的波形 参考文献: 1,基于FPGA的串行FIR滤波器设计与实现 2,FPGA实现FIR滤波器 1,RTL代码 timescale 1ns / 1ps /…

子虔与罗克韦尔自动化合作 进博会签约自动化净零智造联创中心

11月6日进博会现场,漕河泾罗克韦尔自动化净零智造联创中心合作协议签约暨合作伙伴(第一批)授牌仪式举办,子虔科技作为联创中心合作伙伴签约,携手共建智能制造,引领行业可持续发展。 图示:子虔科…

从0开始学习JavaScript--深入理解JavaScript的async/await

JavaScript的异步编程在过去经历了回调地狱、Promise的引入,而今,通过async/await,让我们获得了更加优雅、可读性更高的异步编程方式。本文将深入探讨async/await的概念、用法,并通过丰富的示例代码展示其在实际应用中的威力。 理…

SPDK NVMe-oF target多路功能介绍

基本概念 SPDK NVMe-oF target multi-path是基于NVMe协议的multi-path IO和namespace sharing功能。 NVMe multi-path IO指的是两个或多个完全独立的PCI Express路径存在于一个主机和一个命名空间。 而namespace 共享是两个或多个主机使用不同的NVMe控制器访问一个shared na…

2023.11.22使用flask做一个简单的图片浏览器

2023.11.22使用flask做一个简单的图片浏览器 功能: 实现图片浏览(翻页)功能 程序页面: 程序架构: 注意:在flask中常会使用src“{{ url_for(‘static’, filename‘images/’ image) }}”&#xff0c…

利用ros实现单片机通讯(转载)

我觉得如果使用这个人的micro_ros通信协议,就不用再去Ubuntu或者Windows上面自己写驱动程序了, 利用micro_ros实现esp32与ros2的通讯 Tianci ​ 天津大学 工学博士 参考:https://github.com/micro-ROS/micro_ros_arduino https://blog.cs…

【开源】基于Vue和SpringBoot的服装店库存管理系统

项目编号: S 052 ,文末获取源码。 \color{red}{项目编号:S052,文末获取源码。} 项目编号:S052,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 服…

森林之子/Sons Of The Forest V42457 资源分享

游戏介绍: 视频介绍: 森林之子 资源分享 这里是引用 你被派到了一座孤岛上,寻找一位失踪的亿万富翁,结果却发现自己深陷被食人生物占领的炼狱之地。你需要制作工具和武器、建造房屋,倾尽全力生存下去,无论…

MySQL之BETWEEN AND包含范围查询总结

一、时间范围 查询参数格式与数据库类型相对应时,between and包含头尾,否则依情况 当数据库字段中存储的是yyyy-MM-dd格式,即date类型: 用between and查询, 参数yyyy-MM-dd格式时,包含头尾,相当…

【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…

C++ 多态和虚函数详解

本文章内容来源于C课堂上的听课笔记 多态基础 多态(Polymorphism)是面向对象编程中的一个重要概念,它允许使用统一的接口来表示不同的对象和操作。多态性有两种主要形式:静态多态性(编译时多态性)和动态多…

【设备树添加节点】

节点结束位置都需要加分号 of_iomap 完成映射 of_property_read_u32_array of_property_read_string of_fine_node_by_path

子虔科技出席2023WAIC“智能制造融合创新论坛”

7月7日,2023世界人工智能大会(WAIC)闵行会场在大零号湾举办。子虔科技联合创始人周洋作为专家嘉宾受邀参与智能制造融合创新论坛大会。会上探讨了工业和制造业数字化转型的机遇、挑战和对策。其中,周洋提到,工业制造业…

【电路笔记】-电源电压

电源电压 文章目录 电源电压1、概述1.1 交流发电机1.2 电池1.3 理想电压源1.4 实际电压源1.5 连接规则 2、相关源2.1 压控电压源 (VCVS)2.2 电流控制电压源 (CCVS) 3、总结 在本文中,我们详细介绍了称为电源电压的重要电子元件的架构、功能和使用。 我们首先提出理想…