带缓存的输入输出流(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,321outputStream2.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,321writer.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等。 


总结

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

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

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

相关文章

[ ROS入门]

00ROS实现流程大致分为5步 先创建一个工作空间;再创建一个功能包;编辑源文件;编辑配置文件;编译并执行。 01创建工作空间 02进入src创建ros包并添加依赖 上述命令,会在工作空间下生成一个功能包,该功能包依…

关于外网java后端服务访问内网minio中间件,因连接minio超时,启动失败问题

注:服务器情况:2台服务器,内网服务器包含(activemq、minio、nginx、redis、mysql、后端java服务)。外网服务器只有后端java服务,访问内网的中间件(内网服务器开放了部分指定端口) 问…

Unity应用开机自启动

使用说明 以代码设置的方式设置Unity应用开机自启动。 将下面脚本挂载到场景物体,通过UI按钮开启应用自启动和取消应用自启动,设置下次运行应用生效。 所用到的Dll下载地址:Interop.IWshRuntimeLibrary 脚本代码 using System; using Syst…

将本地项目推送至gitlab仓库

1. gitlab上新建一个空白项目 gitlab上点击new project按钮,新建一个项目 新建空白项目 项目名称与本地新建项目名称相同,其余根据具体需要选择 2. 初始化本地仓库并commit项目 进入本地项目根目录下,右击 git bash here打开命令窗口 初始化…

Netty-NioServerSocketChannel与NioSocketChannel

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

3DGS渐进式渲染 - 离线生成渲染视频

总览 输入:环绕Object拍摄的RGB视频 输出:自定义相机路径的渲染视频(包含渐变效果) 实现过程 首先,编译3DGS的C代码,并跑通convert.py、train.py和render.py。教程如下: github网址&#xf…

HarmonyOS开发实例:【分布式数据服务】

介绍 分布式数据服务(Distributed Data Service,DDS)为应用程序提供不同设备间数据分布式的能力。通过调用分布式数据接口,应用程序将数据保存到分布式数据库中。通过结合帐号、应用和分布式数据服务对属于不同的应用的数据进行隔离,保证不同…

Java项目实现Excel导出(Hutool)

官网&#xff1a; Excel生成-ExcelWriter (hutool.cn) 1.使用Hutool工具实现Excel导出&#xff08;.xlsx格式&#xff09; 业务场景&#xff1a; 使用SpringCloudmysqlmybatis-plus需要将数据库中的数据导出到Excel文件中 前端为Vue2 第零步&#xff1a;导入依赖 <!-…

ASP.NET Core 标识(Identity)框架系列(四):闲聊 JWT 的缺点,和一些解决思路

前言 前面的几篇文章讲了很多 JWT 的优点&#xff0c;但作为技术人员都知道&#xff0c;没有一种技术是万能的 “银弹”&#xff0c;所谓有矛就有盾&#xff0c;相比 Session、Cookie 等传统的身份验证方式&#xff0c;JWT 在拥有很多优点的同时&#xff0c;也有着不可忽视的缺…

49.HarmonyOS鸿蒙系统 App(ArkUI)Tab导航组件的使用

HarmonyOS鸿蒙系统 App(ArkUI)Tab导航组件的使用 图片显示 Row() {Image($r(app.media.leaf)).height(100).width(100)Image($r(app.media.icon)).height(100).width(100) } 左侧导航 import prompt from ohos.prompt; import promptAction from ohos.promptAction; Entry C…

适用于Windows电脑的最佳数据恢复软件是哪些?10佳数据恢复软件

丢失我们系统中可用的宝贵信息是很烦人的。我们可以尝试几种手动方法来重新获取丢失的数据。然而&#xff0c;当我们采用非自动方法来恢复数据时&#xff0c;这是一项令人厌烦和乏味的工作。在这种情况下&#xff0c;我们可以尝试使用一些正版硬盘恢复软件进行数据恢复。此页面…

pytest学习-pytorch单元测试

pytorch单元测试 一.公共模块[common.py]二.普通算子测试[test_clone.py]三.集合通信测试[test_ccl.py]四.测试命令五.测试报告 希望测试pytorch各种算子、block、网络等在不同硬件平台,不同软件版本下的计算误差、耗时、内存占用等指标. 本文基于torch.testing._internal 一…

wsl安装与日常使用

文章目录 一、前向配置1、搜索功能2、勾选下面几个功能&#xff0c;进行安装二、安装WSL1、打开Windows PowerShell,查找你要安装的linux版本2、选择对应版本进行安装3、输入用户名以及密码 三、配置终端代理1、打开powershell,查看自己的IP把以下信息加入到~/.bashrc中 四、更…

Transformer with Transfer CNN for Remote-Sensing-Image Object Detection

遥感图像&#xff08;RSI&#xff09;中的目标检测始终是遥感界一个充满活力的研究主题。 最近&#xff0c;基于深度卷积神经网络 (CNN) 的方法&#xff0c;包括基于区域 CNN 和基于 You-Only-Look-Once 的方法&#xff0c;已成为 RSI 目标检测的事实上的标准。 CNN 擅长局部特…

夸克AI PPT初体验:一键生成大纲,一键生成PPT,一键更换模板!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

JavaScript(JS)三种使用方式,三种输出方式,及快速注释。---[用于后续web渗透内容]

JavaScript&#xff08;JS&#xff09;是一种广泛使用的编程语言&#xff0c;允许在网页中添加交互性和动态效果。在HTML中&#xff0c;<script>标签用于引入和执行JavaScript代码。 JS代码 js1.html \\js三种使用方式<!DOCTYPE html> <html lang"en&quo…

vulhub weblogic全系列靶场

简介 Oracle WebLogic Server 是一个统一的可扩展平台&#xff0c;专用于开发、部署和运行 Java 应用等适用于本地环境和云环境的企业应用。它提供了一种强健、成熟和可扩展的 Java Enterprise Edition (EE) 和 Jakarta EE 实施方式。 需要使用的工具 ysoserial使用不同库制作的…

自动驾驶时代的物联网与车载系统安全:挑战与应对策略

随着特斯拉CEO埃隆马斯克近日对未来出行景象的描绘——几乎所有汽车都将实现自动驾驶&#xff0c;这一愿景愈发接近现实。马斯克生动比喻&#xff0c;未来的乘客步入汽车就如同走进一部自动化的电梯&#xff0c;无需任何手动操作。这一转变预示着汽车行业正朝着高度智能化的方向…

Python学习之-typing详解

前言&#xff1a; Python的typing模块自Python 3.5开始引入&#xff0c;提供了类型系统的扩展&#xff0c;能够帮助程序员定义变量、函数的参数和返回值类型等。这使得代码更易于理解和检查&#xff0c;也方便了IDE和一些工具进行类型检查&#xff0c;提升了代码的质量。 typ…

【每日刷题】Day17

【每日刷题】Day17 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 19. 删除链表的倒数第 N 个结点 - 力扣&#xff08;LeetCode&#xff09; 2. 162. 寻找峰值 - 力扣…