JavaSE&字节缓冲流

这篇具有很好参考价值的文章主要介绍了JavaSE&字节缓冲流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JavaSE&字节缓冲流,Java SE,java,IO

欢迎来到 请回答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) );

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

JavaSE&字节缓冲流,Java SE,java,IO

搬运这部电影耗时如下:

JavaSE&字节缓冲流,Java SE,java,IO
可以看到, 耗时达到了惊人的 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()用于按行读取文本文件,这些功能使得使用缓冲流更加便利。

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


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

JavaSE&字节缓冲流,Java SE,java,IO文章来源地址https://www.toymoban.com/news/detail-859821.html



到了这里,关于JavaSE&字节缓冲流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从零开始学习 Java:简单易懂的入门指南之IO缓冲流、转换流(三十二)

    缓冲流,也叫高效流,是对4个基本的 FileXxx 流的增强,所以也是4个流,按照数据类型分类: 字节缓冲流 : BufferedInputStream , BufferedOutputStream 字符缓冲流 : BufferedReader , BufferedWriter 缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲

    2024年02月08日
    浏览(65)
  • 【Java基础教程】(四十四)IO篇 · 上:File类、字节流与字符流,分析字节输出流、字节输入流、字符输出流和字符输入流的区别~

    掌握 java.io包中类的继承关系 ; 掌握 File类的使用,并且可以通过File类进行文件的创建、删除以及文件夹的列表等操作; 掌握字节流或字符流操作文件内容,字节流与字符流的区别; 在 java.io 包中,如果要进行文件自身的操作 (例如:创建、删除等), 只能依靠 java.io.File 类完

    2024年02月15日
    浏览(33)
  • JAVA SE基础《一》----JAVA入门

    初识Java 1.Java背景知识 java是美国 sun公司(Stanford University Network) 在1995年推出的一门计算机 高级编程语言 。 Java早期称为Oak(橡树),后期改名为Java。 Java之父: 詹姆斯·高斯林(James Gosling) 。 2009年sun公司被 Oracle(甲骨文) 公司收购。 2.Java能做什么? 桌面应用开发:各

    2024年02月09日
    浏览(51)
  • 【Java SE】 详解java访问限定符

    Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。Java中提供了四种访问限定符: 实际只有三种访问限定符,default的意思是默认情况下,不加这三种访问

    2024年02月04日
    浏览(40)
  • 【Netty】字节缓冲区 ByteBuf(七)(下)

    回顾Netty系列文章: Netty 概述(一) Netty 架构设计(二) Netty Channel 概述(三) Netty ChannelHandler(四) ChannelPipeline源码分析(五) 字节缓冲区 ByteBuf (六)(上) 在了解了 ByteBuffer 的原理之后,再来理解Netty 的 ByteBuf 就比较简单了。 ByteBuf 是 Netty 框架封装的数据缓冲区,

    2024年02月06日
    浏览(29)
  • 【Java SE】继承

    学习完了类之后,我们将继续学习一个Java中的重点内容 “继承” 举例:    在Cat类中和Dog类中我们发现有很多一样的地方,这样写太浪费空间和内存了 我们可以把它相同的地方都用一个类来表示,并且使用它1.2 继承概念  那能否将这些共性抽取呢?面向对象思想中提出了

    2024年02月05日
    浏览(43)
  • Java SE 面试题

    请简要介绍 Java SE。 Java SE (Java Standard Edition) 是 Java 平台的基础版本,提供 Java 开发所需的所有核心功能。它包括 Java 语言规范、Java 虚拟机规范和 Java 类库。 请解释 Java 的垃圾回收机制。 Java 的垃圾回收机制是自动内存管理的一部分,用于在堆内存中自动回收不再使用的对

    2024年02月01日
    浏览(53)
  • Java SE:面向对象(下)

    静态区的特点:静态区里面的每一样东西都是唯一有且仅有一个的,如此时str1 = \\\"abc\\\"即此时静态区里面已经创建了字符串abc并将abc地址赋给str1,后面在进行赋值也不会在静态区开辟一串新的\\\"abc\\\"    区分: 一个类的成员有static修饰的成员存储在静态区,statci修饰的成员一旦被

    2024年01月25日
    浏览(52)
  • Java SE 20 新增特性

    作者:Grey 原文地址: 博客园:Java SE 20 新增特性 CSDN:Java SE 20 新增特性 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_features 在Java SE 17 新增特性中,Switch 类型匹配作为预览功能推出,到 Java SE 20 ,这个功能已经是第四次预览版,在 Java SE 17 中,可以通过加强 switc

    2024年02月02日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包