带缓存的输入输出流(I/O)

文章目录

  • 前言
  • 一、带缓冲的输入输出流是什么?
  • 二、使用方法
    • 1.BufferedInputStream与BufferedOutputStream类
    • 2.BufferedReader与BufferedWriter类
  • 总结

前言

        输入输出流可以视为,从A点把货物搬运至B点。那么带缓冲的意思可以视为用货车把A点的货物搬运至B点。顾名思义,带有缓存的输入输出流运行效率更高。本篇文章讲述输入输出流更深一步的使用。


一、带缓存的输入输出流是什么?

        缓存是I/O的一种性能优化。缓存流为I/O流增加了内存缓存区,相当于运输货物过程中的货箱。有了缓存区(比喻,货箱),使得在流上执行skip()、mark()与reset()方法都可以使用。总而言之,这篇文章讲述,在输入输出流外部进行包装,带有缓存功能,提高IO流效率。(需要导入java.io包)

二、使用方法

1.BufferedInputStream与BufferedOutputStream类

构造方法:

new BufferedInputStream(InputStream in);
//将字节输入流包装成一个带有32个字节的缓存字节输入流

new BufferedInputStream(InputStream in,int size);
//将字节输入流包装成一个带有指定个数字节的缓存字节输入流

new BufferedOutputStream(OutputStream out);
//将字节输出流包装成一个带有32个字节的缓存字节输出流

new BufferedOutputStream(OutputStream out,int size);
//将字节输出流包装成一个带有指定个数字节的缓存字节输出流

实操展示:

项目:通过缓存字节输出流输入数据至文件中,再由缓存字节输入流读取出来。计时运行时间,比较一下带缓存和不带缓存的区别。

import java.io.*;
public class Demo {
    public static void main(String[] args) {
        File file = new File("show.txt");
        
        BufferedOutputStream outputStream2 = null;
        FileOutputStream outputStream = null;
        
        BufferedInputStream inputStream2 = null;
        FileInputStream inputStream = null;
        
        long startime = System.currentTimeMillis();
        try{
           
            outputStream = new FileOutputStream(file);
            outputStream2 = new BufferedOutputStream(outputStream);
            String str = "安得广厦千万间";
            byte b[] = str.getBytes();
            outputStream2.write(b);
            outputStream2.flush();  
//包装后需要每次写入都刷新一下,保证写入内容完整,装不满字节数是不会写入的,刷新直接将其写入

            byte b2[] = new byte[1024];
            inputStream = new FileInputStream(file);
            inputStream2 = new BufferedInputStream(inputStream);
            int len = inputStream2.read(b2);
            System.out.println("文件内容:"+new String(b2,0,len));
            while (inputStream.read(b2)!=-1);
            long endtime2 = System.currentTimeMillis();
            System.out.println("带缓存的字节输入流所耗时间为:"+(endtime2-startime));
            while (inputStream.read(b)!=-1);
            long endtime = System.currentTimeMillis();
            System.out.println("字节输入流所耗时间为:"+(endtime-startime));


        }catch(IOException e){
            e.printStackTrace();
        }finally{
            try {
                //先开启的流最后关闭,开关顺序为 123,321
                outputStream2.close();
                outputStream.close();
                inputStream2.close();   
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

BufferedOutputStream类缓冲输出字节流使用注意:

(1)在try代码块中实例化,括号引入FileOutputStream对象,进行包装,带入缓冲。

(2)在调用write()方法写入信息时,同时要调用flush()方法刷新,保证字符数据完整存入。

(3)最先开启的流,最后关闭。流的开关顺序为 123,321

BufferedInputStream类缓冲输入字节流使用注意:

(1)在try代码块中实例化,括号引入FileInputStream对象,进行包装,带入缓冲。

(2)最先开启的流,最后关闭。流的开关顺序为 123,321

 运行结果:

        如图所示,带有缓存的字节输入流读取信息的速度更快。无论是输入流还是输出流,带上缓存的目的都是为了提高运行效率。 

2.BufferedReader与BufferedWriter类

        BufferedReader类和BufferedWriter类分别继承了Reader类和Writer类,可以使用其基本方法的同时本施也增加了些方法。 

构造方法:

new BufferedWriter(FileWriter writer);
//将字符输入流包装成一个带有32个字节的缓存字符输入流

new BufferedReader(FileReader reader);
//将字符输出流包装成一个带有32个字节的缓存字符输出流

BufferedWriter类的常用方法
方法功能描述
write(String s,int off,int len)写入字符串s的某一部分(从off到len)
flush()刷新该流的缓存,缓存字符保存进文件中
newLine()写入一个行分隔符,换行

BufferedReader类的常用方法
方法功能描述
read()读取单个字符
readLine()读取一个文本行,并将其返回为字符串。若无数据返回null值。不断读取下一行,直到遇到文件末尾。

 实操展示:

import java.io.*;
public class Demo {
    public static void main(String[] args) {
        File file = new File("show.txt");
        
        BufferedWriter writer = null;
        FileWriter writer2 = null;

        BufferedReader reader = null;
        FileReader reader2 = null;

        try{
           
            writer2 = new FileWriter(file);
            writer = new BufferedWriter(writer2);
            String str1 = "长亭外,古道边,芳草碧连天。";
            String str2 = "晚风拂柳笛声残,夕阳山外山。";
            writer.write(str1);
            writer.newLine();   //换行输入内容
            writer.write(str2);
            writer.flush(); //刷新

            reader2 = new FileReader(file);
            reader = new BufferedReader(reader2);
      
            String tmp = null;
            int i = 1;  //计数器
            while ((tmp=reader.readLine())!= null) {
                //使用readLine()方法读取下一行信息,不需要引入参数保存数据。
                System.out.println("第"+i+"行的内容为:"+tmp);
                i++;
            }

        }catch(IOException e){
            e.printStackTrace();
        }finally{
            try {
                //先开启的流最后关闭,开关顺序为 123,321

                writer.close();
                writer2.close();

                reader.close();
                reader2.close();
              
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

BufferedWriter类缓冲输入字节流使用注意:

(1)在try代码块中实例化,括号引入FileInWriter对象,进行包装,带入缓冲。

(2)在调用write()方法写入信息时,同时要调用flush()方法刷新,保证字符数据完整存入。

(3)最先开启的流,最后关闭。流的开关顺序为 123,321

BufferedReader类缓冲输出字节流使用注意:

(1)在try代码块中实例化,括号引入FileOutputStream对象,进行包装,带入缓冲。

(2)最先开启的流,最后关闭。流的开关顺序为 123,321

运行结果:

文件输入内容 

 

 文件输出内容

        如图所示,字符输入输出流包装后,带入缓存。不仅能提升字符数据传输的效率,而且还能使用额外方便的方法,例如,readLine()、newLine等。 


总结

        以上就是带缓存的输入输出流,本文只是简单介绍了带缓存的输入输出流的使用,而输入输出流带上缓存既能提高运行速度,又有新的便利的方法可供使用。

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

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

相关文章

代码随想录算法训练营DAY28(记录)|C++回溯算法Part.5|491.递增子序列、46.全排列、47.全排列II

文章目录 491.递增子序列思路伪代码CPP代码优化代码 46.全排列思路伪代码CPP代码 47.全排列IICPP代码 491.递增子序列 力扣题目链接 文章链接:491.递增子序列 视频连接:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列…

安装GPT 学术优化 (GPT Academic)@FreeBSD

GPT 学术优化 (GPT Academic)是一个非常棒的项目 可以帮助我们完成中科院的一些日常工作。 官网:GitHub - binary-husky/gpt_academic: 为GPT/GLM等LLM大语言模型提供实用化交互接口,特别优化论文阅读/润色/写作体验,模块化设计,…

win2022服务器apache配置https(ssl)真实环境实验(避坑之作)不依赖宝塔小皮等集成环境

本次实验背景: 完全参考官方 https://cloud.tencent.com/document/product/400/4143 文档流程,没有搞定,于是写下避坑之作。 服务器:腾讯云轻量应用服务器 操作系统: Windows Server 2022 DataCenter 64bit CN apache…

51-41 Stable Video Diffusion,高质量视频生成新时代

23年11月,Stability AI公司公开了稳定视频扩散模型Stable Video Diffusion(SVD)的代码和权重,视频生成迎来了新时代。SVD是一种潜在扩散模型,支持文本生成视频、图像生成视频以及物体多视角3D合成。从工程角度来看,本文主要提出了…

C++如何使用string类

文章目录 为什么要学习string?库中的string关于编码ASCII编码Unicode编码 迭代器Iteratorsstring常用构造接口接口声明与功能说明接口演示 string类对象的容量操作接口声明与功能说明接口演示reverse与resize在不同平台下的扩容与缩容机制 string类对象的访问及遍历操作接口声…

Java项目实现图形验证码(Hutool)

项目架构: 使用SpringCloudmysqlmybatis-plus需要将数据库中的数据导出到Excel文件中 前端为Vue2 业务场景: 登录时使用验证码登录 1.1 打开hutool, 搜索 图片验证码 1.2后端编写生产验证码方法 1.3前端 1.3.1展示验证码 1.3.2 前端方法 1.3.2.1UU…

Django中的数据库优化与ORM性能调优【第169篇—ORM性能调优】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Django中的数据库优化与ORM性能调优 在开发基于Django的Web应用程序时,数据库是…

ubuntu 查询mysql的用户名和密码 ubuntu查看username

ubuntu 查询mysql的用户名和密码 ubuntu查看username 文章标签mysqlUbuntu用户名文章分类MySQL数据库 一.基本命令 1.查看Ubuntu版本 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.5 LTS Release: 16.04 Coden…

leetcode-分割链表

题目 面试题 02.04. 分割链表 提示 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你不需要 保留 每个分区中各节点的初始相对位置。 示例 1: 输入&#xff…

linux-centos虚拟机设置固定ip

环境准备 虚拟机版本:centos7 安装环境:vmware17 1、设置网络连接 虚拟机-设置-网络适配器-NAT模式 2、查看子网信息 编辑-虚拟网络编辑器-NAT模式-NAT设置 查看子网ip和网关ip 下一步要用 3、修改配置文件 vim /etc/sysconfig/network-scripts…

BGP边界网关路由实验(华为)

一,技术简介 BGP(边界网关路由协议)是一种自治系统(AS)间的协议,主要用于在不同的AS之间交换路由信息。AS是一个由一组网络设备和路由器组成的网络集合,这些设备可以在一个共同的管理域中协同工…

Netty-NioServerSocketChannel与NioSocketChannel

NioServerSocketChannel NioServerSocketChannel是netty服务端的channel。在ServerbootStrap的bind方法中,通过反射,实例化对象NioServerSocketChannel。   NioServerSocketChannel对象实例化的过程中。 AbstractChannel中实例化channel的id&#xff…

【QT进阶】Qt Web混合编程之QWebEngineView基本用法

往期回顾 【QT入门】Qt自定义控件与样式设计之自定义QTabWidget实现tab在左,文本水平的效果-CSDN博客【QT进阶】Qt Web混合编程之CEF、QCefView简单介绍-CSDN博客 【QT进阶】Qt Web混合编程之VS2019 CEF的编译与使用-CSDN博客 【QT进阶】Qt Web混合编程之QWebEngi…

通过Idea部署Tomcat服务器

1.在idea中创建项目 有maven构建工具就创建maven,没有就正常创建一个普通的java程序 创建普通java项目 2.添加框架 3.配置 Tomcat 注意:创建web项目后我们需要配置tomcat才能运行,下面我们来进行配置。 4.添加部署 回到服务器 5.完善配置 6…

EFK环境搭建(基于K8S环境部署)

目录 一.环境信息二.安装nfs供应商三.安装elasticsearch四.安装kibana组件五.安装fluentd 一.环境信息 1.服务器及k8s版本 IP地址主机名称角色版本192.168.40.180master1master节点1.27192.168.40.181node1node1节点1.27192.168.40.182node2node2节点1.27 2.部署组件版本 序…

Python 数据结构和算法实用指南(二)

原文:zh.annas-archive.org/md5/66ae3d5970b9b38c5ad770b42fec806d 译者:飞龙 协议:CC BY-NC-SA 4.0 第四章:列表和指针结构 我们已经在 Python 中讨论了列表,它们方便而强大。通常情况下,我们使用 Python…

近端安全互联样例使用指导

样例介绍 本样例基于rk3568开发板,通过封装openharmony安全子系统deviceauth组件提供的能力,实现了一组可用于设备间快速建立可信认证和连接的接口,通过预先定义关系网,在设备初始化阶段完成端端设备间的认证,构建安全…

ES源码四:网络通信层流程

听说ES网络层很难?今天来卷它😄 前言 ES网络层比较复杂,分为两个部分: 基于HTTP协议的REST服务端基于TCP实现的PRC框架 插件化设计的网络层模块(NetworkModule) 入口还是上一章的创建Node构造方法的地方…

目标检测应用场景—数据集【NO.31】布匹数据集目标检测数据集

写在前面:数据集对应应用场景,不同的应用场景有不同的检测难点以及对应改进方法,本系列整理汇总领域内的数据集,方便大家下载数据集,若无法下载可关注后私信领取。关注免费领取整理好的数据集资料!今天分享…

uniapp picker 多列选择器用法

uniapp picker 多列选择器联动筛选器交互处理方法, uniapp 多列选择器 mode"multiSelector" 数据及筛选联动交互处理, 通过接口获取数据,根据用户选择当前列选项设置子列数据,实现三级联动效果, 本示例中处…