BufferedOutputStream类讲解

在这里插入图片描述
  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java IO相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~

在这里插入图片描述


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!


文章目录

  • 前言
  • 摘要
  • BufferedOutputStream类
    • 概述
    • 常用方法
    • 源码分析
    • 优缺点
      • 优点:
      • 缺点:
    • 应用场景
    • 性能测试和分析
      • 测试代码
      • 测试代码分析
      • 测试结果
    • 小结
  • 总结
  • ☀️建议/推荐你
  • 📣关于我

前言

  在Java开发过程中,IO操作是我们必定会遇到的问题。而对于IO操作的性能问题,也是我们需要特别关注的问题。在Java中,我们可以通过使用BufferedOutputStream来提升IO操作的性能。本文将深入探讨BufferedOutputStream的奥秘,以提升Java IO性能。

摘要

本文将从以下几个方面入手,探究BufferedOutputStream的奥秘:

  1. BufferedOutputStream的概述和使用方法
  2. BufferedOutputStream的源代码解读
  3. BufferedOutputStream的性能测试和分析

  通过对BufferedOutputStream的深入研究,我们将了解到如何正确使用BufferedOutputStream来提升IO操作的性能,同时也可以更深入地了解Java IO的实现原理。

BufferedOutputStream类

概述

  BufferedOutputStream是Java中的一个IO流,它是OutputStream类的子类。与OutputStream不同的是,BufferedOutputStream提供了一种缓冲机制,能够将数据写入内存缓存区中,当缓存区达到一定大小时,才一次性写入到磁盘中。这种缓冲机制能够提高IO操作的效率。

常用方法

BufferedOutputStream有以下几个重要的方法:

  1. 构造方法:BufferedOutputStream(OutputStream out)
  2. 写入方法:void write(int b)
  3. 写入方法:void write(byte[] b, int off, int len)
  4. 刷新方法:void flush()
  5. 关闭方法:void close()

使用BufferedOutputStream的步骤如下:

  1. 创建输出流对象:BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"));
  2. 写入数据:bos.write("hello world".getBytes());
  3. 刷新数据:bos.flush();
  4. 关闭流:bos.close();

  需要注意的是,当使用BufferedOutputStream的时候,不要忘记使用flush()方法将缓存区中的数据写入磁盘中,否则数据可能不会被写入磁盘中。

源码分析

下面是BufferedOutputStream的源代码:

public class BufferedOutputStream extends FilterOutputStream {protected byte[] buf;protected int count;public BufferedOutputStream(OutputStream out) {this(out, 8192);}public BufferedOutputStream(OutputStream out, int size) {super(out);if (size <= 0) {throw new IllegalArgumentException("Buffer size <= 0");}buf = new byte[size];}public synchronized void write(int b) throws IOException {if (count >= buf.length) {flushBuffer();}buf[count++] = (byte) b;}public synchronized void write(byte[] b, int off, int len) throws IOException {if (len >= buf.length) {flushBuffer();out.write(b, off, len);return;}if (len > buf.length - count) {flushBuffer();}System.arraycopy(b, off, buf, count, len);count += len;}public synchronized void flush() throws IOException {flushBuffer();out.flush();}public void close() throws IOException {flush();out.close();}protected void flushBuffer() throws IOException {if (count > 0) {out.write(buf, 0, count);count = 0;}}
}

  从源代码中可以看出,BufferedOutputStream的实现原理就是在内部维护一个缓存区buf。当数据写入缓冲区后,如果缓冲区已满,就会调用flushBuffer()方法将缓冲区中的数据写入到磁盘中。同时,在关闭流之前,也必须调用flush()方法将缓存区中的数据写入磁盘中。

优缺点

  BufferedOutputStream 是 Java I/O 中的一个包装类,它可以提高 I/O 的性能。BufferedOutputStream 的主要作用是增加输出流的缓存。缓冲区的存在可以减少写磁盘的次数,因为数据都是先写入到内存中的缓存区中,等缓存区满了,再一次性将缓存区中的数据写入磁盘。这个过程可以提高写入磁盘的效率。

优点:

1.提高了写入磁盘的效率,缓冲数据减少了写磁盘的次数,减少了磁盘的读写次数,提高了程序的性能。

2.提供了对 I/O 操作的控制,可指定缓存区大小以及写入数据的位置。

3.可以按照字节写入数据,适用于所有类型的数据流。

4.与其他 I/O 类共同存在时,BufferedOutputStream 可以提供缓存增强功能。

缺点:

1.如果缓冲区较小,会增加读写 I/O 的次数,从而降低程序的性能。

2.如果程序写入的数据不满缓冲区大小,程序必须手动清空缓存区,否则写入的数据不会输出到文件。

应用场景

  BufferedOutputStream 适用于需要对数据流进行控制的场景,可以缓存数据减少磁盘的读写次数,提高程序的性能。在网络编程中,可以使用 BufferedOutputStream 提高传输效率,也可用于处理较大的音频、视频文件等数据流。此外,当需要在其他 I/O 类别中使用时,BufferedOutputStream 也可以提供缓存增强功能。

性能测试和分析

测试代码

为了测试BufferedOutputStream的性能,我们编写了如下测试代码:

package com.example.javase.io.bufferedOutputStream;import java.io.BufferedOutputStream;
import java.io.FileOutputStream;/*** @Author bug菌* @Date 2023-10-15 20:29*/
public class BufferedOutputStreamTest {public static void main(String[] args) throws Exception {String text = "hello world,jym!!!";int count = 1000000;long start1 = System.currentTimeMillis();FileOutputStream fos = new FileOutputStream("./template/hello.txt");for (int i = 0; i < count; i++) {fos.write(text.getBytes());}fos.close();long end1 = System.currentTimeMillis();long start2 = System.currentTimeMillis();BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("./template/hello.txt"));for (int i = 0; i < count; i++) {bos.write(text.getBytes());}bos.close();long end2 = System.currentTimeMillis();System.out.println("普通输出流耗时:" + (end1 - start1) + "ms");System.out.println("带缓存输出流耗时:" + (end2 - start2) + "ms");}
}

测试代码分析

根据如上测试代码进行分析:

  1. 导入需要的包。
  2. 创建一个字符串变量 text,并赋值为 hello world,jym!!!,创建一个整型变量 count,并赋值为 1000000。
  3. 通过 System.currentTimeMillis() 获取当前时间戳,作为开始时间 start1。
  4. 创建 FileOutputStream 对象 fos,指向文件路径为 ./template/hello.txt
  5. 使用 for 循环写入 count 次数据,每次调用 fos.write() 方法写入 text 转换为字节数组后的数据。
  6. 关闭 fos 流。
  7. 通过 System.currentTimeMillis() 获取当前时间戳,作为结束时间 end1。
  8. 通过 System.currentTimeMillis() 获取当前时间戳,作为开始时间 start2。
  9. 创建 BufferedOutputStream 对象 bos,通过构造方法传入 FileOutputStream 对象和缓存大小(默认为 8192 字节)。
  10. 使用 for 循环写入 count 次数据,每次调用 bos.write() 方法写入 text 转换为字节数组后的数据。
  11. 关闭 bos 流。
  12. 通过 System.currentTimeMillis() 获取当前时间戳,作为结束时间 end2。
  13. 输出普通输出流和带缓存输出流的耗时差。
  14. 代码执行完毕。

测试结果

测试用例结果如下:

在这里插入图片描述

  测试结果显示,使用BufferedOutputStream后,IO操作的耗时大大减少,性能得到了很大程度的提升。

小结

  本文对Java中的IO操作进行了深入研究,重点关注了BufferedOutputStream的实现原理和使用方法。通过测试,我们也进一步验证了BufferedOutputStream在提高IO操作性能方面的作用。在实际开发中,我们应当更多地使用BufferedOutputStream来提高IO操作的效率,特别是对于大量的数据写入操作。

总结

  通过本文的介绍,我们了解到了BufferedOutputStream的概念、特点、使用方法和实现原理。同时,我们也了解到了如何正确使用BufferedOutputStream来提高IO操作的性能。在实际开发中,我们应当充分利用Java提供的缓存机制,来提高程序的性能。

☀️建议/推荐你


  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

  我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


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

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

相关文章

代码学习记录21--回溯算法第二天

随想录日记part21 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.16 主要内容&#xff1a;今天主要是结合类型的题目加深对回溯算法的理解&#xff1a;1&#xff1a;组合总和&#xff1b;2&#xff1a;电话号码的字母组合 216.组合总和III17.电话号码的字母…

【Redis知识点总结】(五)——Redis实现分布式锁

Redis知识点总结&#xff08;五&#xff09;——Redis实现分布式锁 setnxsetnx expiresetnx expire lua脚本set nx exset nx ex 随机值set nx ex 随机值 lua脚本set ex nx 随机值 lua脚本 锁续期RedissonRedLock 在Redis的众多应用场景中&#xff0c;分布式锁是Redis比…

解决分布式事务,Seata真香!

年IT寒冬&#xff0c;大厂都裁员或者准备裁员&#xff0c;作为开猿节流主要目标之一&#xff0c;我们更应该时刻保持竞争力。为了抱团取暖&#xff0c;林老师开通了《知识星球》&#xff0c;并邀请我阿里、快手、腾讯等的朋友加入&#xff0c;分享八股文、项目经验、管理经验等…

纯 CSS 实现文字换行环绕效果

实现效果 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title><…

Windows10中配置并使用nvidia-smi

1. 问题 当在window10系统中使用nvidia-smi命令时&#xff1a; 会得到提示&#xff1a;nvidia-smi不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 注&#xff1a;其实安装NVIDIA控制面板时&#xff0c;软件已内置安装了nvidia-smi.exe&#xff0c;我们只需…

如何彻底删除Windows10系统D盘文件夹中的DeliveryOptimization

DeliveryOptimization是传递优化创建的文件夹。Windows 10的Delivery Optimization&#xff08;传递优化&#xff09;功能是用于加快下载Windows更新及其他Microsoft Store应用程序的速度的一种技术。Delivery Optimization使用了一个名为“DeliveryOptimization”&#xff08;…

zookeeper快速入门五:用zookeeper实现服务注册与发现中心

系列&#xff1a; zookeeper快速入门一&#xff1a;zookeeper安装与启动-CSDN博客 zookeeper快速入门二&#xff1a;zookeeper基本概念-CSDN博客 zookeeper快速入门三&#xff1a;zookeeper的基本操作 zookeeper快速入门四&#xff1a;在java客户端中操作zookeeper-CSDN博客…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:TabContent)

仅在Tabs中使用&#xff0c;对应一个切换页签的内容视图。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 说明&#xff1a; 可内置系统组件和自定义组件&#xff0c;支…

运用html相关知识编写导航栏和二级菜单

相关代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><s…

Java代码审计安全篇-CSRF漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计和部分师傅审计思路以及webgoat靶场&#xff0c;记录…

[嵌入式系统-40]:龙芯1B 开发学习套件 -10-PMON启动过程start.S详解

目录 一、龙芯向量表与启动程序的入口&#xff08;复位向量&#xff09; 1.1 复位向量&#xff1a; 1.2 代码执行流程 1.3 计算机的南桥 VS 北桥 二、PMON代码执行流程 三、Start.S详解 3.1 CPU初始化时所需要的宏定义 &#xff08;1&#xff09;与CPU相关的一些宏定义…

关于Ubuntu虚拟机识别不了USB设备的解决方案

唉昨天从网上找了一天的解决方案都没法让我的Ubuntu虚拟机识别USB设备&#xff0c;CSDN上有些方法是让从控制面板中进行修复&#xff0c;很多人都是一样的做法链接&#xff0c;那我觉得应该是可以解决的啊&#xff01; 结果我去控制面板执行修复的时候&#xff0c;显示报错“没…

基于Matlab的图像去雾系统设计,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

第二百零八回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"给geolocator插件提交问题的结果"相关的内容&#xff0c;本章回中将介绍自定义标题栏.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我…

在Windows系统上搭建MongoDB-这篇文章刚刚好

在Windows系统上搭建MongoDB集群 文章目录 1.下载MongoDB2.集群描述3.构建集群文件目录4.新建配置文件5.启动MongoDB服务6.配置集群7.集群测试8.设置密码和开启认证一、安装MongoDB 1.下载MongoDB 去MongoDB官网下载解压版免安装的压缩包。 https://www.mongodb.com/try/do…

C语言 数据在内存中的存储

目录 前言 一、整数在内存中的存储 二、大小端字节序和字节序判断 2.1.练习一 2.2 练习二 2.3 练习三 2.4 练习四 2.5 练习五 2.6 练习六 三、浮点数在内存中的存储 3.1 浮点数存的过程 3.2 浮点数取的过程 总结 前言 数据在内存中根据数据类型有不同的存储方式&#xff0c;今…

使用ChatGPT高效完成简历制作[中篇]-有爱AI实战教程(五)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 导读&#xff1a;在使用 ChatGPT 时&#xff0c;当你给的指令越精确&#xff0c;它的回答会越到位&#xff0c;举例来说&#xff0c;假如你要请它帮忙写文案&#xff0c;如果没…

服务器开机不输入密码自动进系统, 与设置开机启动项

打开运行[win R ] 输入&#xff1a; control Userpasswords2设置开机启动项 运行 输入 shell:startup在这里插入图片描述

蓝桥杯2022年第十三届省赛真题-数的拆分

solution1&#xff08;通过10%&#xff09; #include<stdio.h> #include<math.h> typedef long long LL; int isPrime(LL n){LL sqr (int)sqrt(1.0 * n);for(int i 2; i < sqr; i){if(n % i 0) return 0;}return 1; } int main(){int t;LL a;scanf("%d…

如何用saga实现分布式事务?

SAGA事务介绍 SAGA事务模式的历史十分悠久&#xff0c;比分布式事务的概念提出还要更早。SAGA的意思是“长篇故事、长篇记叙、一长串事件”&#xff0c;它起源于1987年普林斯顿大学的赫克托 加西亚 莫利纳&#xff08;Hector Garcia Molina&#xff09;和肯尼斯 麦克米伦&a…