JavaSE字节缓冲流

在这里插入图片描述

欢迎来到 请回答1024 的博客

🍓🍓🍓欢迎来到 请回答1024的博客

关于博主: 我是 请回答1024,一个追求数学与计算的边界、时间与空间的平衡,0与1的延伸的后端开发者。

博客特色: 在我的博客中,开设了如下专栏(点击可以进入专栏奥~): Java、MySQL、Redis、Spring、SpringBoot、SpringCloud、RabbitMQ、微服务、分布式 等相关技术专栏。期待与您一起,探索编程世界中的发现和创新之旅。

🍎🍎🍎我的主页 : https://reply1024.blog.csdn.net

敬请期待定期更新、见解和教程!让我们一起踏上这段编码冒险之旅!

数学与计算的边界 时间与空间的平衡 0与1的延伸

☃️前言

上篇文章讲到 字节流, 发现字节里在搬运文件的时候还是比较耗时的, 比如:

final long l = System.currentTimeMillis();
try(
       FileInputStream fis = new FileInputStream("D:/消失的爱人2014.BD1080P.特效中英双字.mp4");
       FileOutputStream fos = new FileOutputStream("D:/消失的爱人2014.BD1080P.特效中英双字_copy.mp4");

       ){

   byte[] byteArr = new byte[1024];
   int len;
   while( (len = fis.read(byteArr)) != -1 ){
       fos.write(byteArr,0,len);
   }
}catch (IOException e){
   System.out.println(e.getMessage());
}
System.out.println("耗时(ms)" + (System.currentTimeMillis()-l) );

代码显示, 我们搬运一部电影

在这里插入图片描述

搬运这部电影耗时如下:

在这里插入图片描述
可以看到, 耗时达到了惊人的 103 秒.

这就是为什么还需要缓冲流的原因:

虽然Java中提供了字节流,但使用缓冲流的主要目的是为了提高I/O操作的效率。缓冲流是字节流的装饰器,它们可以在字节流的基础上添加缓冲功能,从而减少与磁盘或网络的实际交互次数,提高读写效率。

下面是一些缓冲流的优势:

  • 减少I/O次数: 缓冲流内部维护了一个缓冲区,数据先被写入缓冲区,当缓冲区满了或者达到一定条件时才会真正写入磁盘或网络。这样,多次连续的小数据写入操作就可以合并成一次大的写入操作,减少了实际的I/O次数,提高了效率。

  • 减少系统调用: 直接使用字节流进行I/O操作时,每次读写都会导致系统调用,而系统调用的开销较大。缓冲流通过减少实际的I/O次数,也减少了系统调用的次数,从而提高了程序的性能。

  • 提供更方便的API: 缓冲流提供了更方便的读写方法,例如readLine()、read()、write()等,使得对流的操作更加简洁和高效。

在实际开发中,使用缓冲流能够更好地提高程序的性能和效率,特别是在处理大量数据或者频繁进行I/O操作时。


☃️字节缓冲流

  • 字节缓冲流:

    • BufferOutputStream:缓冲输出流
    • BufferedInputStream:缓冲输入流
  • 构造方法:

    • ​ 字节缓冲输出流:BufferedOutputStream(OutputStream out)
    • ​ 字节缓冲输入流:BufferedInputStream(InputStream in)
  • 为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?

    • ​ 字节缓冲流仅仅提供缓冲区,不具备读写功能 , 而真正的读写数据还得依靠基本的字节流对象进行操作

❄️❄️案例-搬运电影

我们还是实现搬运电影的一个案例, 不过这次使用 缓冲流.

public static void main(String[] args) {
    final long l = System.currentTimeMillis();
    try(
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream("D:/消失的爱人2014.BD1080P.特效中英双字.mp4"));
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:/消失的爱人2014.BD1080P.特效中英双字_copy2.mp4"));
            ){
        byte[] bytes = new byte[1024];
        int len;
        while( (len = bis.read(bytes)) != -1 ){
            bos.write(bytes, 0, len);
        }
    }catch (IOException e){
        System.out.println(e.getMessage());
    }
    System.out.println("耗时(ms)" + (System.currentTimeMillis()-l) );
}

☃️总结

使用缓冲流比直接使用字节流高效的原因主要有以下几点:

  • 减少I/O次数: 缓冲流内部维护了一个缓冲区,数据先被写入缓冲区,当缓冲区满了或达到一定条件时才会真正进行写入或读取操作。这样,多次连续的小数据写入或读取操作就可以合并成一次大的操作,减少了实际的I/O次数,提高了效率。相比之下,直接使用字节流每次读写都直接与磁盘或网络交互,频繁的I/O操作会降低效率。

  • 减少系统调用: 直接使用字节流进行I/O操作时,每次读写都会导致系统调用,而系统调用的开销较大。缓冲流通过减少实际的I/O次数,也减少了系统调用的次数,从而降低了系统调用的开销,提高了程序的性能。

  • 优化数据传输: 缓冲流可以批量地读取或写入数据到缓冲区,然后一次性地进行数据传输,这种批量传输在性能上比逐个字节的传输要高效得多。相比之下,直接使用字节流则可能会导致频繁的小数据传输,效率较低。

  • 提供更方便的API: 缓冲流提供了更方便的读写方法,例如read()、write()等,使得对流的操作更加简洁和高效。而且,缓冲流还提供了一些额外的功能,比如readLine()用于按行读取文本文件,这些功能使得使用缓冲流更加便利。

缓冲流在内部数据处理和与外部系统交互的方式上都进行了优化,因此相比直接使用字节流,能够提高程序的性能和效率。


每一项技术深挖都是一个庞大的体系,学海无涯,共勉。

在这里插入图片描述



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

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

相关文章

ElasticSearch 安装(docker)

下载安装包 阿里云链接: elasticSearch.exe https://www.alipan.com/s/3A356NnmWaJ 提取码: 93da 点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。 安装步骤 1、首先…

【介绍下OneFlow概念清单】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

INA226模块驱动代码-STM32F103

模块: 平台:STM32F103C8T6 标准库 软件模拟IIC C文件: #include "ina226.h"//delay static void delay_nns(uint16_t D) //30纳秒ns 根据手册要用到IIC的HS高速模式 {while(--D); }void delay_nms(uint16_t ms) //毫秒 {uint16_t i;uint3…

Android Dalvik虚拟机JNI方法的注册过程分析

Dalvik虚拟机在调用一个成员函数的时候,如果发现该成员函数是一个JNI方法,那么就会直接跳到它的地址去执行。也就是说,JNI方法是直接在本地操作系统上执行的,而不是由Dalvik虚拟机解释器执行。由此也可看出,JNI方法是A…

欧科云链:为什么减半对比特币生态的影响正在逐步“减弱”?

出品|OKG Research 作者|Jason Jiang 欧科云链OKLink数据显示,比特币于区块高度840000(北京时间2024年4月20日8:09)成功完成第四次减半,比特币挖矿奖励正式由6.25BTC减少至3.125BTC。此次减半之后&#x…

微信小程序:11.本地生活小程序制作

开发工具: 微信开发者工具apifox进行创先Mock 项目初始化 新建小程序项目输入ID选择不使用云开发,js传统模版在project.private.config中setting配置项中配置checkinalidKey:false 梳理项目结构 因为该项目有三个tabbar所以我们要创建三…

Mysql_数据库事务

文章目录 😊 作者:Lion J 💖 主页: https://blog.csdn.net/weixin_69252724 🎉 主题: MySQL__事务) ⏱️ 创作时间:2024年04月26日 ———————————————— 这里写目…

STM32、GD32驱动SHT30温湿度传感器源码分享

一、SHT30介绍 1、简介 SHT30是一种数字湿度和温度传感器,由Sensirion公司生产。它是基于物理蒸发原理的湿度传感器,具有高精度和长期稳定性。SHT30采用I2C数字接口,可以直接与微控制器或其他设备连接。该传感器具有低功耗和快速响应的特点…

Pytorch 的神经网络 学习笔记

参照官方网址 Module — PyTorch 2.2 documentation 一. 介绍 1. torch.nn模块: torch.nn是PyTorch中专门用于构建神经网络的模块。它提供了构建深度学习模型所需的所有构建块,包括各种层类型(如全连接层、卷积层、循环层等)、…

笔记本硬盘坏了怎么把数据弄出来 笔记本硬盘数据恢复一般需要多少钱

现在办公基本都离不开笔记本电脑,就连学生写作业也大多是都在电脑上完成。硬盘作为电脑存储的重要组成部分,承载着存储文件和各类软件的重任。如果硬盘出现故障,基本上这台电脑就无法正常工作,同时我们可能面临丢失很多重要的数据…

js字符串方法总结_js 字符串方法(1)

var count0 var prosstr.indexOf(a) while(pros!-1) {countprosstr.indexOf(a,pros1) } console.log(count);3. chartAt() 返回指定位置的字符 根据下标获取字符var strabcdef console.log(str.charAt(2));4. lastIndexOf() 返回字符串字串出现的最后一处出现的位置索引 没有匹…

Hadoop之路

hadoop更适合在liunx环境下运行,会节省后期很多麻烦,而用虚拟器就太占主机内存了,因此后面我们将把hadoop安装到wsl后进行学习,后续学习的环境是Ubuntu-16.04 (windows上如何安装wsl) 千万强调,有的命令一…

架构师系列-Docker(一)-基础及MYSQL安装

轻量容器引擎Docker Docker是什么 Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。 它基于 Google 公司推出的 Go 语言实现,项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,…

高级控件5-RecyclerView

与ViewPager类似的一个滑动的高级控件是RecyclerView,使用更加灵活。 第1步:添加依赖 打开mvn官网,检索recyclerview,选择使用人数较多的版本,复制依赖,放入项目中即可 快捷方法(复制下面的代…

【Qt】信号与槽

1 🍑信号和槽概述🍑 在 Qt 中,用户和控件的每次交互过程称为⼀个事件。⽐如 “⽤⼾点击按钮” 是⼀个事件,“⽤⼾关闭窗⼝” 也是⼀个事件。每个事件都会发出⼀个信号,例如⽤⼾点击按钮会发出 “按钮被点击” 的信号&…

LabVIEW 2024安装教程(附免费安装包资源)

鼠标右击软件压缩包,选择“解压到LabVIEW.2024”。 返回解压后的文件夹,鼠标右击“ni_labview-2024”选择“装载”。 鼠标右击“Install”选择“以管理员身份运行”。 点击“我接受上述2条许可协议”,然后点击“下一步”。 点击“下一步”。 …

用例整体执行及pytest.ini文件

在我们写代码的过程中,一般都是右键或者命令行去执行一个用例 但是当我们写完后,需要整体执行一遍。那应该怎么搞呢? 我们可以在根目录下新建一个main.py或者run.py之类的文件,文件内容如下: if __name__ "__ma…

Stable Diffusion 常用放大算法详解

常用放大算法 图像放大算法大致有两种: 传统图像放大算法(Lantent、Lanczos、Nearest)AI图像放大算法(4x-UltraSharp、BSRGAN、ESRGAN等) 传统图像放大算法是基于插值算法,计算出图像放大后新位置的像素…

Redis 源码学习记录:字符串

redisObject Redis 中的数据对象 server/redisObject.h 是 Redis 对内部存储的数据定义的抽象类型其定义如下: typedef struct redisObject {unsigned type:4; // 数据类型,字符串,哈希表,列表等等unsigned encoding:4; …

微信小程序:9.小程序配置

全局配置文件 小程序根目录下的app.json文件是小程序的全局配置文件。 常用的配置文件如下: pages 记录当前小程序所有的页面存放路径信息 window 全局设置小程序窗口外观 tabBar 设置小程序底部的tabBar效果 style 是否启用新版style 小程序窗口的组成部分 了解windo节点常…
最新文章