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和功能,可以方便地对文件进行读取、写入和处理,同时支持各种类型的文件操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/174767.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务 Spring Cloud 8,开源RPC框架如何选型?

目录 一、开源RPC框架有哪些?1、跟语言平台绑定的开源RPC框架2、跨语言平台的开源RPC框架 二、跟语言平台绑定的开源RPC框架 -- Dubbo1、Dubbo的架构主要包含四个角色2、Dubbo的调用框架是如何实现的? 三、如何选择?四、跨语言平台的开源RPC框…

继承【C++】

继承【C】 一.什么是继承?二. 继承的方式与权限三. 继承中的成员3.0 基类和派生类中的重名成员i. 限定符ii. 隐藏 3.1 继承与默认成员函数i. 默认构造ii. 析构函数 3.2 继承与友元函数3.3 继承与静态成员变量 四. 基类和派生类的赋值五. 多继承5.1 菱形继承5.2 菱形…

CFCA证书——基于SM2/3算法的安全信任

在中国金融认证中心(CFCA)发行的证书中,采用了最新的国密SM2/3算法来提供更高的安全保障。这一创新举措进一步增强了我国网络安全能力,并为用户提供了一种更可靠、更安全的选择。 SM2/3算法是中国自主研发的非对称加密算法&#…

瑞格心理咨询系统设置多个管理员的操作方法

使用瑞格心理咨询系统,需要设置多个admin权限的管理员账号来管理,咨询厂家答复只能有1个管理员,个人觉得不可能,于是开始折腾。 解决办法: 在没有数据字典的情况下, 通过遍历数据库,发现用户信…

python趣味编程-5分钟实现一个石头剪刀布游戏(含源码、步骤讲解)

Python 中的石头剪刀布代码是 使用Tkinter和图形用户界面(GUI)设计的。 Python 石头剪刀布游戏是使用Python 编程语言开发的简单桌面应用程序。 项目系统文件包含资源文件和Python脚本。游戏画面流畅,用户控制起来很容易。

大数据:SAS数据分析1,数据步,和过程步

大数据:SAS数据分析 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle,尤其sql…

2023年DevOps国际峰会暨BizDevOps企业峰会(DOIS北京站)-核心PPT资料下载

一、峰会简介 在数字化转型的大背景下,企业选择实践 DevOps 来提升 IT 效能成为常态,BizDevOps 作为企业自身数字化变革的重要主题之一,需要全行业共同努力促进繁荣和发展。从 DevOps 到 BizDevOps,业务与技术如何融合&#xff1…

JAVAEE---多线程

内核 内核时操作系统的核心 操作系统有内核态和用户态,像我们平时所用到的qq音乐,微信等都属于用户态执行的程序。那么qq音乐播放音乐需要用到扬声器,扬声器的操作就是在内核空间进行操作,用户态不能对其进行操作。 操作系统 …

移远通信推出六款新型天线,为物联网客户带来更丰富的产品选择

近日,移远通信重磅推出六款新型天线,覆盖5G、非地面网络(NTN)等多种新技术,将为物联网终端等产品带来全新功能和更强大的连接性能。 移远通信COO张栋表示:“当前,物联网应用除了需要高性能的天线…

基于卷尾猴算法优化概率神经网络PNN的分类预测 - 附代码

基于卷尾猴算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于卷尾猴算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于卷尾猴优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络…

雷电模拟器报错:g_bGuestPoweroff.fastpipeapi. cpp_1153_1161

文章目录 一、报错详情:二、解决:【1】设置Windows功能【2】设置cmd(管理员身份)【3】重启电脑 三、windows10其中1809版本出现1153、1161,需要关闭内核隔离 一、报错详情: 二、解决: 【1】设置…

909-2014-T2

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 二叉树采用二叉链表存储结构,设计算法,判断二叉树是否为满二叉树。叙述算法思想并给出算法实现。 2.算法思想 通过一次遍历,得到结点个数和树的高度。用结点个数和树的高…

什么是高防CDN?有什么优势?

德迅高防CDN技术概述 随着互联网的快速发展,网络安全问题越来越受到人们的关注。高防CDN(Content Delivery Network)作为一种有效的网络安全防御手段,在企业和个人网站中得到了广泛应用。本文将详细介绍高防CDN的技术原理、防御原理、优点和应用场景&am…

TransmittableThreadLocal - 线程池中也可以传递参数了

一、InheritableThreadLocal的不足 InheritableThreadLocal可以用于主子线程之间传递参数,但是它必须要求在主线程中手动创建的子线程才可以获取到主线程设置的参数,不能够通过线程池的方式调用。 但是现在我们实际的项目开发中,一般都是采…

用 HLS 实现 UART

用 HLS 实现 UART 介绍 UART 是一种旧的串行通信机制,但仍在很多平台中使用。它在 HDL 语言中的实现并不棘手,可以被视为本科生的作业。在这里,我将通过这个例子来展示在 HLS 中实现它是多么容易和有趣。 因此,从概念上讲&#xf…

秋招JAVA面经总结

面试的范围是Java基础+Java并发+Java框架+mysql+网络。 Java基础 重载与重写有什么区别? 重载(Overloading)指的是在同一个类中,可以有多个同名方法,它们具有不同的参数列表(参数类型、参数个数或参数顺序不同),编译器根据调用时的参数类型来决定调用哪个方法。 重写…

会声会影2024出来了吗?会声会影2023怎么使用?

会声会影20247中文旗舰版 Corel VideoStudio 是一款功能强大的视频编辑软件,可以帮助用户创建高质量的视频作品。它提供了一系列完善的编辑功能,包括视频编辑、音频编辑、调色、特效、字幕、标题等。它还支持多种视频格式,可以将视频转换为多…

CSDN专栏设置

文章目录 一、规则1.1、专栏数量与等级关联1.2、等级与积分关联1.3、积分1.3.1、积分获取1.3.2、积分被扣 二、配置2.1、入口2.2、新建2.2.1、一级专栏2.2.2、二级专栏 2.3、快捷编辑2.4、拖拽 一、规则 写了一阵子CSDN博客后,发现自己新增专栏的时候提示不能再新增…

Linux调度域与调度组

引入调度域的讨论可以参考这篇文章。这篇笔记重点分析了内核调度域相关的数据结构以及内核用于构建调度域的代码实现,以此来加深对调度域的理解。调度域是调度器进行负载均衡的基础。 调度域拓扑层级 整个系统的调度域组成一个层级结构,内核设计了stru…

909-2015-T2

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 编写算法,删除二叉搜索树(二叉排序树)的最小元素。叙述算法思想并给出算法实现,分析算法复杂性。二叉树采用链式存储结构,节点结构如下:…