Java IO 学习总结(三)BufferedInputStream 缓冲流

news2024/11/26 14:33:59

Java IO 学习总结(一)输入流/输出流
Java IO 学习总结(二)File 类
Java IO 学习总结(三)BufferedInputStream

前言:

学习IO流,记录并分享。文章如有错误,恳请指正。

BufferedInputStream 类图:

BufferedInputStream 类图

1、什么是 BufferedInputStream?

BufferedInputStream 是缓冲输入流。它继承于 FilterInputStream。BufferedInputStream 的作用是为一个输入流添加一些功能,例如,提供“缓冲功能”以及支持 “mark() 标记” 和 “reset() 重置” 方法。

2、为什么要用 BufferedInputStream?

已经有了 FileInputStream 为什么要用 BufferedInputStream?
输入流在默认情况下是不被缓冲区缓存的,也就是说,每个read的调用都会请求操作系统再分发一个字节。

BufferedInputStream 通过装饰器模式,增强其它输入流的功能。BufferedInputStream 将数据读取到内存中,减少了磁盘IO次数,效率上得到了一定的提升。

根据百度搜索的相关资料,及我自己做了几个简单的测试效率的Demo,并未发现 FileInputStream 和 BufferedInputStream 的效率差距很大,效率上基本五五开的。对此还是有些不明,上述为各个资料阅读后的总结。

如有大佬了解更深,恳请帮忙解答下什么情况下 BufferedInputStream 的效率会高于 FileInputStream ,谢谢。

3、BufferedInputStream 源码说明

(1)变量:

private static int defaultBufferSize = 8192; //内置缓存字节数组默认的大小 8KB 
protected volatile byte buf[];    // 内置缓存字节数组  
protected int count;    // 当前buf中的字节总数、注意不是底层字节输入流的源中字节总数 
protected int pos; // 当前buf中下一个被读取的字节下标
protected int markpos = -1;    // 最后一次调用mark(int readLimit)方法记录的buf中下一个被读取的字节的位置 
protected int marklimit;    // 调用mark后、在后续调用reset()方法失败之前云寻的从in中读取的最大数据量、用于限制被标记后buffer的最大值

(2)构造方法:

/**
 * Creates a <code>BufferedInputStream</code>
 * and saves its  argument, the input stream
 * <code>in</code>, for later use. An internal
 * buffer array is created and  stored in <code>buf</code>.
 *
 * @param   in   the underlying input stream.
 */
public BufferedInputStream(InputStream in) {
    this(in, DEFAULT_BUFFER_SIZE);
}

/**
 * Creates a <code>BufferedInputStream</code>
 * with the specified buffer size,
 * and saves its  argument, the input stream
 * <code>in</code>, for later use.  An internal
 * buffer array of length  <code>size</code>
 * is created and stored in <code>buf</code>.
 *
 * @param   in     the underlying input stream.
 * @param   size   the buffer size.
 * @exception IllegalArgumentException if {@code size <= 0}.
 */
public BufferedInputStream(InputStream in, int size) {
    super(in);
    if (size <= 0) {
        throw new IllegalArgumentException("Buffer size <= 0");
    }
    buf = new byte[size];
}

简单介绍:

public BufferedInputStream(InputStream in); // 创建一个缓冲输入流,缓存容器使用默认大小 8192 字节(8kb)
public BufferedInputStream(InputStream in, int size); // 创建一个指定缓存容器大小的缓冲输入流

(3)公共Api:

int available();  // 返回底层流对应的源中有效可供读取的字节数      
void close();  // 关闭此流、释放与此流有关的所有资源  
boolean markSupport();  // 查看此流是否支持mark
void mark(int readLimit); // 标记当前buf中读取下一个字节的下标  
int read();  // 读取buf中下一个字节  
int read(byte[] b, int off, int len);  // 读取buf中下一个字节   
void reset();   // 重置最后一次调用mark标记的buf中的位子  
long skip(long n);  // 跳过n个字节、 不仅仅是buf中的有效字节、也包括in的源中的字节 

4、怎么使用 BufferedInputStream?

public static void main(String[] args) {
      String filePath = "D:/test/as.png";
      String filePath1 = "D:/test/success/a.png";
      File oldFile = new File(filePath);
      File newFile = new File(filePath1);
      copyFile(oldFile, newFile);
  }

/**
 * 将 A 文件的内容复制到 B 文件中
 * 
 * @param oldFile 源文件路径
 * @param newFile 要被复制的文件路径
 */
private static void copyFile(File oldFile, File newFile) {
    // 输入流
    InputStream inputStream = null;
    BufferedInputStream bufferedInputStream = null;
    // 输出流
    OutputStream outputStream = null;
    BufferedOutputStream bufferedOutputStream = null;
    try {
        inputStream = new FileInputStream(oldFile);
        bufferedInputStream = new BufferedInputStream(inputStream);
        outputStream = new FileOutputStream(newFile);
        bufferedOutputStream = new BufferedOutputStream(outputStream);
        byte[] kb = new byte[1024];
        int length = 0; //代表实际读取的字节数
        while ((length = bufferedInputStream.read(kb)) != -1) {
            bufferedOutputStream.write(kb, 0, length);
        }
        //缓冲区的内容写入到文件
        bufferedOutputStream.flush();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (bufferedOutputStream != null) {
                bufferedOutputStream.close();
            }
            if (bufferedInputStream != null) {
                bufferedInputStream.close();
            }
            if (inputStream != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

Java IO 学习总结(四) 正在完善中,后续更新~


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

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

相关文章

云上使用 Stable Diffusion ,模型数据如何共享和存储

随着人工智能技术的爆发&#xff0c;内容生成式人工智能&#xff08;AIGC&#xff09;成为了当下热门领域。除了 ChatGPT 之外&#xff0c;文本生成图像技术更令人惊艳。 Stable Diffusion&#xff0c;是一款开源的深度学习模型。与 Midjourney 提供的直接将文本转化为图像的服…

基于JAVA的心理咨询预约系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 心理健康在现代社会中…

vue js vue3 uniapp日期操作工具类组件,格式化、加减日月年

官网文档 官网&#xff1a;https://momentjs.com/ 文档&#xff1a;https://momentjs.com/docs/ 安装 npm install moment -s全局引用 import moment from moment;//uniapp vue3 全局引用 app.config.globalProperties.$moment moment;日期格式 示例&#xff1a;YYYY-MM-…

Unity3d_shader_Outline()

1、[Unity] 引入“全局轮廓”&#xff0c;只需附加组件即可使用轮廓着色器 【Unity】コンポーネントをアタッチするだけでアウトラインシェーダが使用できる「Global Outline」紹介 - コガネブログ 下载&#xff1a;https://github.com/rickomax/globaloutline 2、[Unity] 綺…

latent-diffusion model环境配置,这可能是你能够找到的最细的博客了

文章目录 前言一、环境配置1.创建requirement.txt文件2.提前从Github上下载好taming-transformers和clip3.创建conda环境&#xff0c;并安装requirement.txt文件4.安装torch 1.85.本地下载Bert模型权重&#xff0c;修改加载Bert的代码6.测试环境 2.训练自己的LDM模型 前言 最近…

几个基于springboot在线服务过段时间突然停掉的原因

有几个基于springboot的服务今天发现突然停掉了&#xff0c;也不知道什么原因&#xff0c;所以只能看一下日志了 主要日志如下&#xff1a; 2023-06-17 14:26:21.775 DEBUG o.s.b.f.s.DefaultListableBeanFactory- Retrieved dependent beans for bean dataSource: [mybatisCo…

使用了并发工具类库,线程安全就高枕无忧了吗?

1、说明 在代码审核讨论的时候&#xff0c;我们有时会听到有关线程安全和并发工具的一些片面的观点和结论&#xff0c;比如“把 HashMap 改为 ConcurrentHashMap&#xff0c;就可以解决并发问题了呀”&#xff0c;“要不我们试试无锁的 CopyOnWriteArrayList 吧&#xff0c;性能…

并发线程 (2) - C++线程间共享数据【详解:如何使用锁操作】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 期待你的关注哦&#xff01;&#xff01;&#xff01; 快乐在于态度&#xff0c;成功在于细节&#xff0c;命运在于习惯。 Happiness lies in the attitude, s…

【机器学习】——神经网络与深度学习

目录 引入 一、神经网络及其主要算法 1、前馈神经网络 2、感知器 3、三层前馈网络&#xff08;多层感知器MLP&#xff09; 4、反向传播算法 二、深度学习 1、自编码算法AutorEncoder 2、自组织编码深度网络 ①栈式AutorEncoder自动编码器 ②Sparse Coding稀疏编码 …

(一)OC对象本质---内存布局

Apple OSS Distributions GitHubApple Open Source 开源源码链接 面试题1 一个NSObject对象占用多少内存&#xff1f; 系统分配了16个字节给NSObject对象&#xff08;通过malloc_size函数获得&#xff09; ​​​​​​​但NSObject对象内部只使用了8个字节的空间&#xf…

【状态估计】粒子滤波器、Σ点滤波器和扩展/线性卡尔曼滤波器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

推荐一些简单却很实用的工具,快收藏起来吧

第一个工具&#xff1a;remove.bg 这是一个在线抠图的神器&#xff0c;它能够帮助你轻松地消除图片中的背景。相信很多人都知道&#xff0c;手动抠图真的很累&#xff0c;抠着抠着就会觉得烦躁。但是&#xff0c;使用这个神器&#xff0c;你只需要点击上传图片&#xff0c;就能…

Git安装与使用方法入门

目录 Git简介 Git下载与安装 Git配置环境变量 Git使用方法入门 Git简介 Git是一个帮助开发者追踪代码变化和团队协作的工具。它记录了代码修改的历史&#xff0c;并允许回到过去的版本。开发者可以创建分支来独立开发新功能&#xff0c;而不影响主代码。团队成员可以共享代…

@EnableScheduling和@Scheduled注解详解fixedrate和fixeddelay的区别

一、pom.xml中导入必要的依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.1.RELEASE</version></parent><dependencies><…

Selenium教程__元素定位(2)

Selenium操作页面上的文本输入框、按钮、单选框、复选框等&#xff0c;凡是能在页面显示的任何元素都需要先对元素进行定位。 Selenium提供了以下方法来定位页面中元素&#xff1a; find_element_by_id&#xff1a;通过id属性值进行匹配查找&#xff0c;返回匹配到的第一个元…

利用zOffice SDK实现合同续签系统

经过用户调研和实际考察发现。商务、政务和个人的真实使用场景中&#xff0c;很多用户会有通过“用户数据”“固定模板”生成“批量合同&#xff08;文件&#xff09;”的需求&#xff0c;并且存在着使用痛点。在在线办公不断发展的今天&#xff0c;我们需要一个在线编辑的工具…

使用Jsoup工具解析页面数据

前提是需要联网 F12打开浏览器控制台&#xff0c;通过元素找到需要爬取的数据 1、添加网页解析依赖 <!--解析网页依赖--> <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.10.2</version&g…

【id:21】【1分】E. DS单链表--类实现

题目描述 用C语言和类实现单链表&#xff0c;含头结点 属性包括&#xff1a;data数据域、next指针域 操作包括&#xff1a;插入、删除、查找 注意&#xff1a;单链表不是数组&#xff0c;所以位置从1开始对应首结点&#xff0c;头结点不放数据 类定义参考 输入 n 第1行先输…

GRE over IPsec VPN配置

GRE over IPsec VPN配置 【实验目的】 理解GRE Tunnel的概念。理解GRE over IPsec VPN的概念。掌握GRE Tunnel的配置。掌握GRE over IPsec VPN的配置。验证配置。 【实验拓扑】 实验拓扑如下图所示。 实验拓扑 设备参数表如下表所示。 设备参数表 设备 接口 IP地址 子网…

Ziya:一个自回归、双语、开源和多功能的大语言模型

什么是Ziya&#xff1f; Ziya是一个基于LLaMa的130亿参数的中英双语预训练语言模型&#xff0c;它由IDEA研究院认知计算与自然语言研究中心&#xff08;CCNL&#xff09;推出&#xff0c;是开源通用大模型系列的一员。Ziya具备翻译&#xff0c;编程&#xff0c;文本分类&#…